Add constructor with additional schema types
This commit is contained in:
		| @@ -21,6 +21,6 @@ module Language.GraphQL.Type | ||||
|     ) where | ||||
|  | ||||
| import Language.GraphQL.Type.Definition | ||||
| import Language.GraphQL.Type.Schema (Schema, schema) | ||||
| import Language.GraphQL.Type.Schema (Schema, schema, schemaWithTypes) | ||||
| import qualified Language.GraphQL.Type.In as In | ||||
| import qualified Language.GraphQL.Type.Out as Out | ||||
|   | ||||
| @@ -12,6 +12,7 @@ module Language.GraphQL.Type.Internal | ||||
|     , Directives | ||||
|     , Schema(..) | ||||
|     , Type(..) | ||||
|     , description | ||||
|     , directives | ||||
|     , doesFragmentTypeApply | ||||
|     , implementations | ||||
| @@ -55,41 +56,43 @@ type Directives = HashMap Full.Name Directive | ||||
| -- | A Schema is created by supplying the root types of each type of operation, | ||||
| --   query and mutation (optional). A schema definition is then supplied to the | ||||
| --   validator and executor. | ||||
| -- | ||||
| --   __Note:__ When the schema is constructed, by default only the types that | ||||
| --   are reachable by traversing the root types are included, other types must | ||||
| --   be explicitly referenced. | ||||
| data Schema m = Schema | ||||
|     (Out.ObjectType m) | ||||
|     (Maybe (Out.ObjectType m)) | ||||
|     (Maybe (Out.ObjectType m)) | ||||
|     Directives | ||||
|     (HashMap Full.Name (Type m)) | ||||
|     (Maybe Text) -- ^ Description. | ||||
|     (Out.ObjectType m) -- ^ Query. | ||||
|     (Maybe (Out.ObjectType m)) -- ^ Mutation. | ||||
|     (Maybe (Out.ObjectType m)) -- ^ Subscription. | ||||
|     Directives -- ^ Directives | ||||
|     (HashMap Full.Name (Type m)) -- ^ Types. | ||||
|     -- Interface implementations (used only for faster access). | ||||
|     (HashMap Full.Name [Type m]) | ||||
|  | ||||
| -- | Schema description. | ||||
| description :: forall m. Schema m -> Maybe Text | ||||
| description (Schema description' _ _ _ _ _ _) = description' | ||||
|  | ||||
| -- | Schema query type. | ||||
| query :: forall m. Schema m -> Out.ObjectType m | ||||
| query (Schema query' _ _ _ _ _) = query' | ||||
| query (Schema _ query' _ _ _ _ _) = query' | ||||
|  | ||||
| -- | Schema mutation type. | ||||
| mutation :: forall m. Schema m -> Maybe (Out.ObjectType m) | ||||
| mutation (Schema _ mutation' _ _ _ _) = mutation' | ||||
| mutation (Schema _ _ mutation' _ _ _ _) = mutation' | ||||
|  | ||||
| -- | Schema subscription type. | ||||
| subscription :: forall m. Schema m -> Maybe (Out.ObjectType m) | ||||
| subscription (Schema _ _ subscription' _ _ _) = subscription' | ||||
| subscription (Schema _ _ _ subscription' _ _ _) = subscription' | ||||
|  | ||||
| -- | Schema directive definitions. | ||||
| directives :: forall m. Schema m -> Directives | ||||
| directives (Schema _ _ _ directives' _ _) = directives' | ||||
| directives (Schema _ _ _ _ directives' _ _) = directives' | ||||
|  | ||||
| -- | Types referenced by the schema. | ||||
| types :: forall m. Schema m -> HashMap Full.Name (Type m) | ||||
| types (Schema _ _ _ _ types' _) = types' | ||||
| types (Schema _ _ _ _ _ types' _) = types' | ||||
|  | ||||
| -- | Interface implementations. | ||||
| implementations :: forall m. Schema m -> HashMap Full.Name [Type m] | ||||
| implementations (Schema _ _ _ _ _ implementations') = implementations' | ||||
| implementations (Schema _ _ _ _ _ _ implementations') = implementations' | ||||
|  | ||||
| -- | These types may describe the parent context of a selection set. | ||||
| data CompositeType m | ||||
|   | ||||
| @@ -9,11 +9,13 @@ | ||||
| -- functions for defining and manipulating schemas. | ||||
| module Language.GraphQL.Type.Schema | ||||
|     ( schema | ||||
|     , schemaWithTypes | ||||
|     , module Language.GraphQL.Type.Internal | ||||
|     ) where | ||||
|  | ||||
| import Data.HashMap.Strict (HashMap) | ||||
| import qualified Data.HashMap.Strict as HashMap | ||||
| import Data.Text (Text) | ||||
| import Language.GraphQL.AST.DirectiveLocation (DirectiveLocation(..)) | ||||
| import qualified Language.GraphQL.AST.DirectiveLocation as DirectiveLocation | ||||
| import qualified Language.GraphQL.AST as Full | ||||
| @@ -22,6 +24,7 @@ import Language.GraphQL.Type.Internal | ||||
|     , Directives | ||||
|     , Schema | ||||
|     , Type(..) | ||||
|     , description | ||||
|     , directives | ||||
|     , implementations | ||||
|     , mutation | ||||
| @@ -35,17 +38,47 @@ import qualified Language.GraphQL.Type.In as In | ||||
| import qualified Language.GraphQL.Type.Out as Out | ||||
|  | ||||
| -- | Schema constructor. | ||||
| -- | ||||
| -- __Note:__ When the schema is constructed, by default only the types that | ||||
| -- are reachable by traversing the root types are included, other types must | ||||
| -- be explicitly referenced using 'schemaWithTypes' instead. | ||||
| schema :: forall m | ||||
|     . Out.ObjectType m -- ^ Query type. | ||||
|     -> Maybe (Out.ObjectType m) -- ^ Mutation type. | ||||
|     -> Maybe (Out.ObjectType m) -- ^ Subscription type. | ||||
|     -> Directives -- ^ Directive definitions. | ||||
|     -> Schema m -- ^ Schema. | ||||
| schema queryRoot mutationRoot subscriptionRoot directiveDefinitions = | ||||
|     Internal.Schema queryRoot mutationRoot subscriptionRoot | ||||
| schema queryRoot mutationRoot subscriptionRoot = | ||||
|     schemaWithTypes Nothing queryRoot mutationRoot subscriptionRoot mempty | ||||
|  | ||||
| -- | Constructs a complete schema, including user-defined types not referenced | ||||
| -- in the schema directly (for example interface implementations). | ||||
| schemaWithTypes :: forall m | ||||
|     . Maybe Text -- ^ Schema description | ||||
|     -> Out.ObjectType m -- ^ Query type. | ||||
|     -> Maybe (Out.ObjectType m) -- ^ Mutation type. | ||||
|     -> Maybe (Out.ObjectType m) -- ^ Subscription type. | ||||
|     -> [Type m] -- ^ Additional types. | ||||
|     -> Directives -- ^ Directive definitions. | ||||
|     -> Schema m -- ^ Schema. | ||||
| schemaWithTypes description' queryRoot mutationRoot subscriptionRoot types' directiveDefinitions = | ||||
|     Internal.Schema description' queryRoot mutationRoot subscriptionRoot | ||||
|         allDirectives collectedTypes collectedImplementations | ||||
|   where | ||||
|     collectedTypes = collectReferencedTypes queryRoot mutationRoot subscriptionRoot | ||||
|     allTypes = foldr addTypeDefinition HashMap.empty types' | ||||
|     addTypeDefinition type'@(ScalarType (Definition.ScalarType typeName _)) accumulator = | ||||
|         HashMap.insert typeName type' accumulator | ||||
|     addTypeDefinition type'@(EnumType (Definition.EnumType typeName _ _)) accumulator = | ||||
|         HashMap.insert typeName type' accumulator | ||||
|     addTypeDefinition type'@(ObjectType (Out.ObjectType typeName _ _ _)) accumulator = | ||||
|         HashMap.insert typeName type' accumulator | ||||
|     addTypeDefinition type'@(InputObjectType (In.InputObjectType typeName _ _)) accumulator = | ||||
|         HashMap.insert typeName type' accumulator | ||||
|     addTypeDefinition type'@(InterfaceType (Out.InterfaceType typeName _ _ _)) accumulator = | ||||
|         HashMap.insert typeName type' accumulator | ||||
|     addTypeDefinition type'@(UnionType (Out.UnionType typeName _ _)) accumulator = | ||||
|         HashMap.insert typeName type' accumulator | ||||
|     collectedTypes = collectReferencedTypes queryRoot mutationRoot subscriptionRoot allTypes | ||||
|     collectedImplementations = collectImplementations collectedTypes | ||||
|     allDirectives = HashMap.union directiveDefinitions defaultDirectives | ||||
|     defaultDirectives = HashMap.fromList | ||||
| @@ -98,11 +131,12 @@ collectReferencedTypes :: forall m | ||||
|     -> Maybe (Out.ObjectType m) | ||||
|     -> Maybe (Out.ObjectType m) | ||||
|     -> HashMap Full.Name (Type m) | ||||
| collectReferencedTypes queryRoot mutationRoot subscriptionRoot = | ||||
|     let queryTypes = traverseObjectType queryRoot HashMap.empty | ||||
|     -> HashMap Full.Name (Type m) | ||||
| collectReferencedTypes queryRoot mutationRoot subscriptionRoot extraTypes = | ||||
|     let queryTypes = traverseObjectType queryRoot extraTypes | ||||
|         mutationTypes = maybe queryTypes (`traverseObjectType` queryTypes) | ||||
|             mutationRoot | ||||
|      in maybe mutationTypes (`traverseObjectType` queryTypes) subscriptionRoot | ||||
|      in maybe mutationTypes (`traverseObjectType` mutationTypes) subscriptionRoot | ||||
|   where | ||||
|     collect traverser typeName element foundTypes | ||||
|         | HashMap.member typeName foundTypes = foundTypes | ||||
|   | ||||
		Reference in New Issue
	
	Block a user