morpheus-graphql-code-gen-0.22.0: src/Data/Morpheus/CodeGen/Server/Internal/AST.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskellQuotes #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Morpheus.CodeGen.Server.Internal.AST
( ModuleDefinition (..),
CodeGenConfig (..),
ServerDeclaration (..),
GQLTypeDefinition (..),
CONST,
TypeKind (..),
TypeName,
TypeRef (..),
TypeWrapper (..),
unpackName,
DerivingClass (..),
FIELD_TYPE_WRAPPER (..),
Kind (..),
ServerDirectiveUsage (..),
TypeValue (..),
InterfaceDefinition (..),
GQLDirectiveTypeClass (..),
)
where
import Data.Morpheus.CodeGen.Internal.AST
( CodeGenType,
CodeGenTypeName,
DerivingClass (..),
FIELD_TYPE_WRAPPER (..),
TypeValue (..),
)
import Data.Morpheus.CodeGen.TH
( PrintExp (..),
PrintType (..),
)
import Data.Morpheus.Server.Types
( SCALAR,
TYPE,
enumDirective,
fieldDirective,
typeDirective,
)
import Data.Morpheus.Types.Internal.AST
( CONST,
DirectiveLocation (..),
FieldName,
TypeKind (..),
TypeName,
TypeRef (..),
TypeWrapper (..),
Value,
unpackName,
)
import Language.Haskell.TH.Lib (appE, conT, varE)
import Prettyprinter (Pretty (..), (<+>))
import Relude
data ModuleDefinition = ModuleDefinition
{ moduleName :: Text,
imports :: [(Text, [Text])],
extensions :: [Text],
types :: [ServerDeclaration]
}
data Kind
= Scalar
| Type
deriving (Show, Eq)
instance Pretty Kind where
pretty Type = "TYPE"
pretty Scalar = "SCALAR"
instance PrintType Kind where
printType Scalar = conT ''SCALAR
printType Type = conT ''TYPE
data ServerDirectiveUsage
= TypeDirectiveUsage TypeValue
| FieldDirectiveUsage FieldName TypeValue
| EnumDirectiveUsage TypeName TypeValue
deriving (Show)
instance PrintExp ServerDirectiveUsage where
printExp (TypeDirectiveUsage x) = appE (varE 'typeDirective) (printExp x)
printExp (FieldDirectiveUsage field x) = appE (appE (varE 'fieldDirective) [|field|]) (printExp x)
printExp (EnumDirectiveUsage enum x) = appE (appE (varE 'enumDirective) [|enum|]) (printExp x)
instance Pretty ServerDirectiveUsage where
pretty (TypeDirectiveUsage value) = "typeDirective" <+> pretty value
pretty (FieldDirectiveUsage place value) = "fieldDirective" <+> pretty (show place :: String) <+> pretty value
pretty (EnumDirectiveUsage place value) = "enumDirective" <+> pretty (show place :: String) <+> pretty value
data GQLTypeDefinition = GQLTypeDefinition
{ gqlTarget :: CodeGenTypeName,
gqlKind :: Kind,
gqlTypeDirectiveUses :: [ServerDirectiveUsage],
gqlTypeDefaultValues :: Map Text (Value CONST),
dropNamespace :: Maybe (TypeKind, Text)
}
deriving (Show)
data InterfaceDefinition = InterfaceDefinition
{ aliasName :: TypeName,
interfaceName :: TypeName,
unionName :: TypeName
}
deriving (Show)
data GQLDirectiveTypeClass = GQLDirectiveTypeClass
{ directiveTypeName :: CodeGenTypeName,
directiveLocations :: [DirectiveLocation]
}
deriving (Show)
data ServerDeclaration
= GQLTypeInstance GQLTypeDefinition
| GQLDirectiveInstance GQLDirectiveTypeClass
| DataType CodeGenType
| ScalarType {scalarTypeName :: Text}
| InterfaceType InterfaceDefinition
deriving (Show)
newtype CodeGenConfig = CodeGenConfig
{ namespace :: Bool
}