void ExecuteSelectionSet(ModifiableSelectionSet ss, __Type objectType, Object objectValue, Dictionary <string, Object> variableValues) { var visitedFragments = new Dictionary <string, GraphQLParser.FragmentDefinitionContext>(); var groupedFieldSet = CollectFields(objectType, ss, variableValues, visitedFragments); var resultMap = new OrderedDictionary <string, object>(); foreach (string responseKey in groupedFieldSet.Keys) { var fields = groupedFieldSet[responseKey] as List <GraphQLParser.FieldContext>; var fieldName = fields.First().fieldName().GetText(); var field = objectType.GetField((x) => x.name == fieldName); if (field == null) { if (fieldName == "__schema") { IsSchemaQuery = true; field = schema.GetType("__SchemaContainer").GetField((x) => x.name == "__schema"); objectValue = schema; objectType = schema.GetType("__SchemaContainer"); } else { continue; } } var fieldType = field.type; if (objectType.kind == __TypeKind.UNION) { if (field.parentType.dotNetType != objectValue.GetType()) { continue; } ExecuteField(fields.First(), field.parentType, objectValue, fieldType, fields, variableValues, visitedFragments); } else { ExecuteField(fields.First(), objectType, objectValue, fieldType, fields, variableValues, visitedFragments); } } }
Object ResolveFieldValue(__Type objectType, Object objectValue, String fieldName, Dictionary <string, Object> argumentValues, GraphQLParser.FieldContext field) { if (objectValue == null) { return(null); } if (fieldName == "__typename") { return(objectType.name); } var fieldObj = objectType.GetField(x => x.name == fieldName); if (fieldObj == null) { Error($"Could not resolve property type - {fieldName} in context of {objectType.name}", field); } if (fieldObj.FieldType == __Field.FieldTypeEnum.Property && argumentValues.Any()) { Error($"Found a property type - {fieldName} - but are presented with set of argumentValues, indicating it should be a method type ", field); } if (fieldObj.ResolveProperty == null && fieldObj.ResolveMethod == null) { Error($"Found a property type - {fieldName} from {objectType.name} which has no method or property resolver", field); } if (fieldObj.ResolveProperty != null) { return(fieldObj.ResolveProperty(objectValue)); } else { return(fieldObj.ResolveMethod(objectValue, argumentValues)); } }
public Dictionary <string, Object> CoerceArgumentValues(__Type objectType, GraphQLParser.FieldContext field, Dictionary <string, Object> variableValues) { if (field.arguments() == null) { return(emptyArgs); } var coercedValues = new Dictionary <string, Object>(); var argumentValues = field.arguments().argument(); var fieldName = field.fieldName().GetText(); var objectField = objectType.GetField((x) => x.name == fieldName); if (objectField == null) { Error( $"Could not find field with name - {fieldName} in objecttype with name: {objectType.name} and underlying type:{objectType.dotNetType.Name}", field); } foreach (var argumentDefinition in objectField.args) { var argumentName = argumentDefinition.name; var argumentType = argumentDefinition.type; var defaultValue = argumentDefinition.defaultValue; var value = argumentValues.Where(x => x.NAME().GetText() == argumentName) .Select(x => x.valueOrVariable()) .FirstOrDefault(); if (value?.variable() != null) { var variableName = value.variable().NAME().GetText(); Object variableValue = null; if (variableValues.ContainsKey(variableName)) { variableValue = variableValues[variableName]; } if (variableValue != null) { coercedValues[argumentName] = variableValue; } else if (defaultValue != null) { coercedValues[argumentName] = defaultValue; } else if (argumentType.kind == __TypeKind.NON_NULL) { Error( $"Required field '{argumentName}' refered by variable '{variableName}' is not present in document", field); } else { continue; } } else if (value?.value() == null) { if (defaultValue != null) { coercedValues[argumentName] = defaultValue; } else if (argumentType.kind == __TypeKind.NON_NULL) { Error($"Required field '{argumentName}' is not present in document", field); } else { continue; } } else { coercedValues[argumentName] = CoerceDocumentValue(argumentType, argumentName, value.value()); } } return(coercedValues); }