コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        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));
            }
        }
コード例 #3
0
        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);
        }