Exemplo n.º 1
0
        }         //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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        // 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_);
                }
            }
        }
Exemplo n.º 4
0
        // 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);
                }
            }
        }
Exemplo n.º 5
0
        public static FieldDef FindField(this ComplexTypeDef fieldSet, string name)
        {
            var fld = fieldSet.Fields.FirstOrDefault(f => f.Name == name);

            return(fld);
        }