Exemplo n.º 1
0
        private ISchema BuildSchemaFrom(GraphQLDocument document)
        {
            var schema = new Schema(DependencyResolver);

            var directives = new List <DirectiveGraphType>();

            GraphQLSchemaDefinition schemaDef = null;

            foreach (var def in document.Definitions)
            {
                switch (def.Kind)
                {
                case ASTNodeKind.SchemaDefinition:
                    schemaDef = def as GraphQLSchemaDefinition;
                    break;

                case ASTNodeKind.ObjectTypeDefinition:
                {
                    var type = ToObjectGraphType(def as GraphQLObjectTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.TypeExtensionDefinition:
                {
                    var type = ToObjectGraphType((def as GraphQLTypeExtensionDefinition).Definition, true);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.InterfaceTypeDefinition:
                {
                    var type = ToInterfaceType(def as GraphQLInterfaceTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.EnumTypeDefinition:
                {
                    var type = ToEnumerationType(def as GraphQLEnumTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.UnionTypeDefinition:
                {
                    var type = ToUnionType(def as GraphQLUnionTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.InputObjectTypeDefinition:
                {
                    var type = ToInputObjectType(def as GraphQLInputObjectTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.DirectiveDefinition:
                {
                    var directive = ToDirective(def as GraphQLDirectiveDefinition);
                    directives.Add(directive);
                    break;
                }
                }
            }

            if (schemaDef != null)
            {
                foreach (var op in schemaDef.OperationTypes)
                {
                    var typeName = op.Type.Name.Value;
                    var type     = GetType(typeName) as IObjectGraphType;

                    switch (op.Operation)
                    {
                    case OperationType.Query:
                        schema.Query = type;
                        break;

                    case OperationType.Mutation:
                        schema.Mutation = type;
                        break;

                    case OperationType.Subscription:
                        schema.Subscription = type;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException($"Unknown operation type {op.Operation}");
                    }
                }
            }
            else
            {
                schema.Query        = GetType("Query") as IObjectGraphType;
                schema.Mutation     = GetType("Mutation") as IObjectGraphType;
                schema.Subscription = GetType("Subscription") as IObjectGraphType;
            }

            var typeList = _types.Values.ToArray();

            typeList.Apply(schema.RegisterType);
            schema.RegisterDirectives(directives.ToArray());

            return(schema);
        }
Exemplo n.º 2
0
        private ISchema BuildSchemaFrom(GraphQLDocument document)
        {
            if (Directives.Count > 0)
            {
                _visitorSelectors.Add(new DirectiveVisitorSelector(Directives, t => (SchemaDirectiveVisitor)ServiceProvider.GetRequiredService(t)));
            }

            var schema = new Schema(ServiceProvider);

            PreConfigure(schema);

            var directives = new List <DirectiveGraphType>();

            GraphQLSchemaDefinition schemaDef = null;

            foreach (var def in document.Definitions)
            {
                switch (def.Kind)
                {
                case ASTNodeKind.SchemaDefinition:
                {
                    schemaDef = def as GraphQLSchemaDefinition;
                    schema.SetAstType(schemaDef);

                    VisitNode(schema, v => v.VisitSchema(schema));
                    break;
                }

                case ASTNodeKind.ObjectTypeDefinition:
                {
                    var type = ToObjectGraphType(def as GraphQLObjectTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.TypeExtensionDefinition:
                {
                    var type = ToObjectGraphType((def as GraphQLTypeExtensionDefinition).Definition, true);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.InterfaceTypeDefinition:
                {
                    var type = ToInterfaceType(def as GraphQLInterfaceTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.EnumTypeDefinition:
                {
                    var type = ToEnumerationType(def as GraphQLEnumTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.UnionTypeDefinition:
                {
                    var type = ToUnionType(def as GraphQLUnionTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.InputObjectTypeDefinition:
                {
                    var type = ToInputObjectType(def as GraphQLInputObjectTypeDefinition);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.DirectiveDefinition:
                {
                    var directive = ToDirective(def as GraphQLDirectiveDefinition);
                    directives.Add(directive);
                    break;
                }
                }
            }

            if (schemaDef != null)
            {
                schema.Description = schemaDef.Comment?.Text;

                foreach (var operationTypeDef in schemaDef.OperationTypes)
                {
                    var typeName = operationTypeDef.Type.Name.Value;
                    var type     = GetType(typeName) as IObjectGraphType;

                    switch (operationTypeDef.Operation)
                    {
                    case OperationType.Query:
                        schema.Query = type;
                        break;

                    case OperationType.Mutation:
                        schema.Mutation = type;
                        break;

                    case OperationType.Subscription:
                        schema.Subscription = type;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException($"Unknown operation type {operationTypeDef.Operation}");
                    }
                }
            }
            else
            {
                schema.Query        = GetType("Query") as IObjectGraphType;
                schema.Mutation     = GetType("Mutation") as IObjectGraphType;
                schema.Subscription = GetType("Subscription") as IObjectGraphType;
            }

            var typeList = _types.Values.ToArray();

            typeList.Apply(schema.RegisterType);
            schema.RegisterDirectives(directives);

            return(schema);
        }
Exemplo n.º 3
0
        private Schema BuildSchemaFrom(GraphQLDocument document)
        {
            var schema = new Schema(ServiceProvider);

            PreConfigure(schema);

            var directives = new List <DirectiveGraphType>();

            foreach (var def in document.Definitions)
            {
                switch (def.Kind)
                {
                case ASTNodeKind.SchemaDefinition:
                {
                    _schemaDef = def.As <GraphQLSchemaDefinition>();
                    schema.SetAstType(_schemaDef);
                    break;
                }

                case ASTNodeKind.ObjectTypeDefinition:
                {
                    var type = ToObjectGraphType(def.As <GraphQLObjectTypeDefinition>());
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.TypeExtensionDefinition:
                {
                    var type = ToObjectGraphType(def.As <GraphQLTypeExtensionDefinition>().Definition, true);
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.InterfaceTypeDefinition:
                {
                    var type = ToInterfaceType(def.As <GraphQLInterfaceTypeDefinition>());
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.EnumTypeDefinition:
                {
                    var type = ToEnumerationType(def.As <GraphQLEnumTypeDefinition>());
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.UnionTypeDefinition:
                {
                    var type = ToUnionType(def.As <GraphQLUnionTypeDefinition>());
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.InputObjectTypeDefinition:
                {
                    var type = ToInputObjectType(def.As <GraphQLInputObjectTypeDefinition>());
                    _types[type.Name] = type;
                    break;
                }

                case ASTNodeKind.DirectiveDefinition:
                {
                    var directive = ToDirective(def.As <GraphQLDirectiveDefinition>());
                    directives.Add(directive);
                    break;
                }
                }
            }

            if (_schemaDef != null)
            {
                schema.Description = _schemaDef.Comment?.Text.ToString();

                foreach (var operationTypeDef in _schemaDef.OperationTypes)
                {
                    var typeName = (string)operationTypeDef.Type.Name.Value;
                    var type     = GetType(typeName) as IObjectGraphType;

                    switch (operationTypeDef.Operation)
                    {
                    case OperationType.Query:
                        schema.Query = type;
                        break;

                    case OperationType.Mutation:
                        schema.Mutation = type;
                        break;

                    case OperationType.Subscription:
                        schema.Subscription = type;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException($"Unknown operation type {operationTypeDef.Operation}");
                    }
                }
            }
            else
            {
                schema.Query        = GetType("Query") as IObjectGraphType;
                schema.Mutation     = GetType("Mutation") as IObjectGraphType;
                schema.Subscription = GetType("Subscription") as IObjectGraphType;
            }

            foreach (var type in _types)
            {
                schema.RegisterType(type.Value);
            }

            foreach (var directive in directives)
            {
                schema.Directives.Register(directive);
            }

            if (_visitors != null)
            {
                foreach (var visitor in _visitors)
                {
                    schema.RegisterVisitor(visitor);
                }
            }

            if (_visitorTypes != null)
            {
                foreach (var type in _visitorTypes)
                {
                    schema.RegisterVisitor(type);
                }
            }

            Debug.Assert(schema.Initialized == false);
            return(schema);
        }