Example #1
0
        private void BuildInputType(InputObjectTypeDef inpTypeDef)
        {
            var type_ = inpTypeDef.Type_;

            foreach (var inpFldDef in inpTypeDef.Fields)
            {
                var inp_ = new __InputValue()
                {
                    Name         = inpFldDef.Name, Description = inpFldDef.Description,
                    DefaultValue = inpFldDef.HasDefaultValue ? inpFldDef.DefaultValue + string.Empty : null,
                    Type         = inpFldDef.TypeRef.Type_
                };
                inpFldDef.Intro_ = inp_;
                type_.InputFields.Add(inp_);
            }
        }
Example #2
0
        private object ReadInputObject(RequestContext context, InputObjectTypeDef inputTypeDef, object jsonValue, IList <object> path)
        {
            var jObj = jsonValue as JObject;

            if (jObj == null)
            {
                AddError(context, "Expected Json object segment.", path);
            }
            var clrType          = inputTypeDef.ClrType;
            var missingFldNamess = inputTypeDef.GetRequiredFields();
            var inputObj         = Activator.CreateInstance(clrType);

            foreach (var prop in jObj.Properties())
            {
                path.Add(prop.Name);
                var fldDef = inputTypeDef.Fields.FirstOrDefault(f => f.Name == prop.Name);
                if (fldDef == null)
                {
                    AddError(context, $"Field {prop.Name} not defined on input object {inputTypeDef.Name}.", path);
                    continue;
                }
                if (missingFldNamess.Contains(prop.Name))
                {
                    missingFldNamess.Remove(prop.Name);
                }

                var value = ReadValue(context, fldDef.TypeRef, prop.Value, path);
                if (value == null && fldDef.TypeRef.IsNotNull)
                {
                    AddError(context, $"Field {prop.Name} on input object {inputTypeDef.Name} may not be null.", path);
                    continue;
                }
                fldDef.InputObjectClrMember.SetMember(inputObj, value);
                path.RemoveAt(path.Count - 1);
            }
            // check that all required fields are provided
            if (missingFldNamess.Count > 0)
            {
                var missingStr = string.Join(", ", missingFldNamess);
                AddError(context, $"Input object {inputTypeDef.Name}: missing required fields: {missingStr}", path);
            }

            return(inputObj);
        }
Example #3
0
        private void BuildInputObjectFields(InputObjectTypeDef inpTypeDef)
        {
            var members = inpTypeDef.ClrType.GetFieldsProps();

            foreach (var member in members)
            {
                var attrs   = GetAllAttributes(member);
                var mtype   = member.GetMemberReturnType();
                var typeRef = GetTypeRef(mtype, member, $"Field {inpTypeDef.Name}.{member.Name}");
                if (typeRef == null)
                {
                    return; // error found, it is already logged
                }
                if (typeRef.IsList && !typeRef.TypeDef.IsEnumFlagArray())
                {
                    // list members must be IList<T> or T[] - this is important, lists are instantiated as arrays when deserializing
                    if (!mtype.IsArray && !mtype.IsInterface)
                    {
                        AddError($"Input type member {inpTypeDef.Name}.{member.Name}: list must be either array or IList<T>.");
                        continue;
                    }
                }
                switch (typeRef.TypeDef.Kind)
                {
                case TypeKind.Scalar:
                case TypeKind.Enum:
                case TypeKind.InputObject:
                    break;

                default:
                    AddError($"Input type member {inpTypeDef.Name}.{member.Name}: type {mtype} is not scalar or input type.");
                    continue;
                }
                var inpFldDef = new InputValueDef()
                {
                    Name = member.Name.FirstLower(), TypeRef = typeRef, Attributes = attrs,
                    InputObjectClrMember = member,
                    Description          = _docLoader.GetDocString(member, member.DeclaringType)
                };
                inpFldDef.Directives = BuildDirectivesFromAttributes(member, DirectiveLocation.InputFieldDefinition, inpFldDef);
                inpTypeDef.Fields.Add(inpFldDef);
            } //foreach
        }