morpheus-graphql-0.1.0: src/Data/Morpheus/Schema/Schema.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Data.Morpheus.Schema.Schema
( initSchema
, findType
, Schema
, Type
) where
import Data.Morpheus.Kind (KIND, OBJECT)
import Data.Morpheus.Schema.Directive (Directive)
import Data.Morpheus.Schema.Internal.RenderIntrospection (Type, createObjectType, renderType)
import Data.Morpheus.Types.GQLType (GQLType (__typeName))
import Data.Morpheus.Types.Internal.Data (DataOutputObject, DataTypeLib (..), allDataTypes)
import Data.Text (Text)
import GHC.Generics (Generic)
type instance KIND Schema = OBJECT
instance GQLType Schema where
__typeName = const "__Schema"
data Schema = Schema
{ types :: [Type]
, queryType :: Type
, mutationType :: Maybe Type
, subscriptionType :: Maybe Type
, directives :: [Directive]
} deriving (Generic)
convertTypes :: DataTypeLib -> [Type]
convertTypes lib' = map renderType (allDataTypes lib')
buildSchemaLinkType :: (Text, DataOutputObject) -> Type
buildSchemaLinkType (key', _) = createObjectType key' "" $ Just []
findType :: Text -> DataTypeLib -> Maybe Type
findType name lib = renderType . (name, ) <$> lookup name (allDataTypes lib)
initSchema :: DataTypeLib -> Schema
initSchema types' =
Schema
{ types = convertTypes types'
, queryType = buildSchemaLinkType $ query types'
, mutationType = buildSchemaLinkType <$> mutation types'
, subscriptionType = buildSchemaLinkType <$> subscription types'
, directives = []
}