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