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_); } }
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); }
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 }