Exemple #1
0
        public __Type(Type t, Dictionary <Type, __Type> resolver, GraphQlCustomiseSchema customise, bool isInputType = false)
        {
            this.resolver        = resolver;
            this.customiseSchema = customise;
            dotNetType           = t;

            if (resolver.ContainsKey(t) == false)
            {
                resolver[t] = this;
            }

            if (TypeCheck.IsNumeric(t) || TypeCheck.IsString(t) || TypeCheck.IsDateTime(t) || TypeCheck.IsBoolean(t))
            {
                ScalarType();
            }
            else if (TypeCheck.IsEnum(t))
            {
                EnumType();
            }
            else if (TypeCheck.IsEnumerableType(t))
            {
                ListType();
            }
            else if (TypeCheck.IsClass(t) && isInputType)
            {
                InputObjectType();
            }
            else if (TypeCheck.IsClass(t))
            {
                ObjectOrInterfaceType(__TypeKind.OBJECT);
            }
            else if (t.IsInterface)
            {
                ObjectOrInterfaceType(__TypeKind.INTERFACE);
            }
            else if (TypeCheck.IsValueType(t))
            {
                throw new Exception($"Unexpected value type = {t.Name}");
            }
            else
            {
                throw new Exception($"Unexpected type = {t.Name}");
            }
        }
Exemple #2
0
        void CompleteValue(__Type fieldType, GraphQLParser.FieldContext field, List <GraphQLParser.FieldContext> fields,
                           Object result,
                           Dictionary <string, Object> variableValues, bool assertNotNull = false, Context context = Context.Object)
        {
            if (fieldType.kind == __TypeKind.NON_NULL)
            {
                var innerType = fieldType.ofType;
                CompleteValue(innerType, field, fields, result, variableValues, true);
            }
            else if (result == null && assertNotNull)
            {
                Error($"Null or empty value was found on non null field", field);
            }
            else if (fieldType.kind == __TypeKind.LIST)
            {
                if (result != null && TypeCheck.IsEnumerableType(result.GetType()) == false)
                {
                    Error($"Did not find list type for {field.fieldName().GetText()} - found {result.GetType().Name}",
                          field);
                }
                var innerType = fieldType.ofType;

                output.PushArray(field.fieldName().GetText());
                if (result != null)
                {
                    foreach (var c in (IEnumerable)result)
                    {
                        if (field.fieldName().GetText() == "types" && IsSchemaQuery && c is __Type &&
                            ((__Type)c).name.StartsWith("__"))
                        {
                            continue;
                        }
                        CompleteValue(innerType, field, fields, c, variableValues, false, Context.List);
                    }
                }
                output.Pop();
            }
            else if (fieldType.kind == __TypeKind.SCALAR || fieldType.kind == __TypeKind.ENUM)
            {
                CoerceDotNetValue(fieldType, field, result, context);
            }
            else if (fieldType.kind == __TypeKind.OBJECT || fieldType.kind == __TypeKind.UNION ||
                     fieldType.kind == __TypeKind.INTERFACE)
            {
                if (fieldType.kind == __TypeKind.OBJECT || fieldType.kind == __TypeKind.UNION)
                {
                    var objectType      = fieldType;
                    var subSelectionSet = MergeSelectionSets(fields);

                    if (context == Context.Object)
                    {
                        if (result == null)
                        {
                            output.AddScalarProperty(field.fieldName().GetText(), null);
                        }
                        else
                        {
                            output.PushObject(field.fieldName().GetText());
                            ExecuteSelectionSet(subSelectionSet, objectType, result, variableValues);
                        }
                    }
                    else if (context == Context.List)
                    {
                        if (result != null)
                        {
                            output.PushObject();
                            ExecuteSelectionSet(subSelectionSet, objectType, result, variableValues);
                        }
                    }

                    if (result != null)
                    {
                        output.Pop();
                    }
                }
                else
                {
                    Error($"Interface and Union not yet supported", field);
                }
            }
            else
            {
                Error($"Unexpected fieldType - {fieldType.kind}", field);
            }
        }