{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Morpheus.CodeGen.Internal.AST
( ModuleDefinition (..),
CodeGenConfig (..),
ServerTypeDefinition (..),
GQLTypeDefinition (..),
CONST,
TypeKind (..),
TypeName,
TypeRef (..),
TypeWrapper (..),
unpackName,
DerivingClass (..),
FIELD_TYPE_WRAPPER (..),
ServerConstructorDefinition (..),
ServerFieldDefinition (..),
Kind (..),
ServerDirectiveUsage (..),
TypeValue (..),
)
where
import Data.Morpheus.Types.Internal.AST
( CONST,
Description,
DirectiveLocation (..),
FieldName,
TypeKind (..),
TypeName,
TypeRef (..),
TypeWrapper (..),
Value,
unpackName,
)
import Prettyprinter (Doc, Pretty (..), punctuate, vsep, (<+>))
import Relude
data ModuleDefinition = ModuleDefinition
{ moduleName :: Text,
imports :: [(Text, [Text])],
extensions :: [Text],
types :: [ServerTypeDefinition]
}
data FIELD_TYPE_WRAPPER
= MONAD
| SUBSCRIPTION
| PARAMETRIZED
| ARG TypeName
| TAGGED_ARG FieldName TypeRef
| GQL_WRAPPER TypeWrapper
deriving (Show)
data DerivingClass
= SHOW
| GENERIC
deriving (Show)
data ServerFieldDefinition = ServerFieldDefinition
{ fieldType :: Text,
fieldName :: FieldName,
wrappers :: [FIELD_TYPE_WRAPPER]
}
deriving (Show)
data Kind = Scalar | Type deriving (Show)
data TypeValue
= TypeValueObject TypeName [(FieldName, TypeValue)]
| TypeValueNumber Double
| TypeValueString Text
| TypeValueBool Bool
| TypeValueList [TypeValue]
| TypedValueMaybe (Maybe TypeValue)
deriving (Show)
renderField :: (FieldName, TypeValue) -> Doc n
renderField (fName, fValue) = pretty (unpackName fName :: Text) <> "=" <+> pretty fValue
instance Pretty TypeValue where
pretty (TypeValueObject name xs) =
pretty (unpackName name :: Text)
<+> "{"
<+> vsep (punctuate "," (map renderField xs))
<+> "}"
pretty (TypeValueNumber x) = pretty x
pretty (TypeValueString x) = pretty (show x :: String)
pretty (TypeValueBool x) = pretty x
pretty (TypedValueMaybe (Just x)) = "Just" <+> pretty x
pretty (TypedValueMaybe Nothing) = "Nothing"
pretty (TypeValueList xs) = prettyList xs
data ServerDirectiveUsage
= TypeDirectiveUsage TypeValue
| FieldDirectiveUsage FieldName TypeValue
| EnumDirectiveUsage TypeName TypeValue
deriving (Show)
data GQLTypeDefinition = GQLTypeDefinition
{ gqlKind :: Kind,
gqlTypeDescription :: Maybe Text,
gqlTypeDescriptions :: Map Text Description,
gqlTypeDirectiveUses :: [ServerDirectiveUsage],
gqlTypeDefaultValues :: Map Text (Value CONST)
}
deriving (Show)
data ServerConstructorDefinition = ServerConstructorDefinition
{ constructorName :: TypeName,
constructorFields :: [ServerFieldDefinition]
}
deriving (Show)
data ServerTypeDefinition
= ServerTypeDefinition
{ tName :: Text,
typeParameters :: [Text],
tCons :: [ServerConstructorDefinition],
tKind :: TypeKind,
derives :: [DerivingClass],
typeGQLType :: Maybe GQLTypeDefinition
}
| DirectiveTypeDefinition
{ directiveConstructor :: ServerConstructorDefinition,
directiveDerives :: [DerivingClass],
directiveLocations :: [DirectiveLocation],
directiveGQLType :: GQLTypeDefinition
}
| ServerInterfaceDefinition
TypeName
TypeName
TypeName
deriving (Show)
newtype CodeGenConfig = CodeGenConfig
{ namespace :: Bool
}