} //method private void AddTypeNameField(ComplexTypeDef typeDef) { var fld = new FieldDef(typeDef, "__typename", _stringNotNull) { Reader = t => typeDef.Name }; fld.Flags |= FieldFlags.Hidden; typeDef.Fields.Add(fld); }
private bool ValidateResolverMethodArguments(ComplexTypeDef typeDef, FieldDef fieldDef) { var resMethod = fieldDef.Resolver.Method; // Check first parameter - must be IFieldContext var prms = resMethod.GetParameters(); if (prms.Length == 0 || prms[0].ParameterType != typeof(IFieldContext)) { AddError($"Resolver method {resMethod.GetFullRef()}: the first parameter must be of type '{nameof(IFieldContext)}'."); return(false); } // compare list of field parameters with list of resolver method parameters; // resolver method has extra FieldContext and Parent parameters var argCountDiff = 1; if (fieldDef.Flags.IsSet(FieldFlags.HasParentArg)) { argCountDiff = 2; } var expectedPrmCount = fieldDef.Args.Count + argCountDiff; if (expectedPrmCount != prms.Length) { AddError($"Resolver method {resMethod.GetFullRef()}: parameter count mismatch with field arguments, expected {expectedPrmCount}, " + "with added IFieldContext and possibly Parent object parameter. "); return(false); } // parameter names/types must be identical for (int i = argCountDiff; i < prms.Length; i++) { var prm = prms[i]; var arg = fieldDef.Args[i - argCountDiff]; if (prm.Name != arg.Name || prm.ParameterType != arg.ParamType) { AddError($"Resolver method {resMethod.GetFullRef()}: parameter name/type mismatch with field argument; parameter: {prm.Name}."); return(false); } } return(true); }
// Object types and interface types private void BuildComplexObjectType(ComplexTypeDef typeDef) { var type_ = typeDef.Type_; // build fields foreach (var fld in typeDef.Fields) { var hidden = fld.Flags.IsSet(FieldFlags.Hidden); // ex: _typename should not be listed as field in intro queries var fld_ = new __Field() { Name = fld.Name, Description = fld.Description, Type = fld.TypeRef.Type_, IsHidden = hidden }; fld.Intro_ = fld_; // convert args foreach (var inpV in fld.Args) { var inpV_ = new __InputValue() { Name = inpV.Name, Description = inpV.Description, Type = inpV.TypeRef.Type_, DefaultValue = inpV.DefaultValue + string.Empty }; inpV.Intro_ = inpV_; fld_.Args.Add(inpV_); } type_.Fields.Add(fld_); } //foreach fld // Interfaces - for ObjectTypes only if (typeDef is ObjectTypeDef objTypeDef) { foreach (var intfDef in objTypeDef.Implements) { var intf_ = intfDef.Type_; type_.Interfaces.Add(intf_); intf_.PossibleTypes.Add(type_); } } }
// used for interface and Object types private void BuildObjectTypeFields(ComplexTypeDef typeDef) { var objTypeDef = typeDef as ObjectTypeDef; var clrType = typeDef.ClrType; var members = clrType.GetFieldsPropsMethods(withMethods: true); foreach (var member in members) { var attrs = GetAllAttributes(member); var ignoreAttr = attrs.Find <IgnoreAttribute>(); if (ignoreAttr != null) { continue; } var mtype = member.GetMemberReturnType(); var typeRef = GetTypeRef(mtype, member, $"Field {clrType.Name}.{member.Name}"); if (typeRef == null) { continue; //error should be logged already } var name = GetGraphQLName(member); var descr = _docLoader.GetDocString(member, clrType); var fld = new FieldDef(typeDef, name, typeRef) { ClrMember = member, Description = descr, Attributes = attrs }; fld.Directives = BuildDirectivesFromAttributes(member, DirectiveLocation.FieldDefinition, fld); if (attrs.Find <HiddenAttribute>() != null) { fld.Flags |= FieldFlags.Hidden; } typeDef.Fields.Add(fld); if (member is MethodInfo method) { BuildFieldArguments(fld, method); } } }
public static FieldDef FindField(this ComplexTypeDef fieldSet, string name) { var fld = fieldSet.Fields.FirstOrDefault(f => f.Name == name); return(fld); }