morpheus-graphql-server-0.22.0: src/Data/Morpheus/Server/Deriving/Schema/Enum.hs
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RecordWildCards #-}
module Data.Morpheus.Server.Deriving.Schema.Enum
( buildEnumTypeContent,
defineEnumUnit,
)
where
import Data.Morpheus.Server.Deriving.Schema.Directive
( deriveEnumDirectives,
visitEnumName,
visitEnumValueDescription,
)
import Data.Morpheus.Server.Deriving.Schema.Internal
( lookupDescription,
)
import Data.Morpheus.Server.Deriving.Utils.Kinded
( KindedType (..),
)
import Data.Morpheus.Server.Types.GQLType
( GQLType,
)
import Data.Morpheus.Server.Types.SchemaT
( SchemaT,
insertType,
)
import Data.Morpheus.Types.Internal.AST
( CONST,
DataEnumValue (..),
LEAF,
TRUE,
TypeContent (..),
TypeDefinition,
TypeName,
mkEnumContent,
mkType,
unitTypeName,
unpackName,
)
buildEnumTypeContent :: GQLType a => KindedType kind a -> [TypeName] -> SchemaT c (TypeContent TRUE kind CONST)
buildEnumTypeContent p@InputType enumCons = DataEnum <$> traverse (mkEnumValue p) enumCons
buildEnumTypeContent p@OutputType enumCons = DataEnum <$> traverse (mkEnumValue p) enumCons
mkEnumValue :: GQLType a => f a -> TypeName -> SchemaT c (DataEnumValue CONST)
mkEnumValue proxy enumName = do
enumDirectives <- deriveEnumDirectives proxy enumName
let desc = lookupDescription proxy (unpackName enumName)
pure
DataEnumValue
{ enumName = visitEnumName proxy enumName,
enumDescription = visitEnumValueDescription proxy enumName desc,
..
}
defineEnumUnit :: SchemaT cat ()
defineEnumUnit =
insertType
( mkType unitTypeName (mkEnumContent [unitTypeName]) ::
TypeDefinition LEAF CONST
)