{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
module Data.Morpheus.Types.Internal.AST.TH
( TypeD (..),
ConsD (..),
mkCons,
GQLTypeD (..),
isEnum,
mkConsEnum,
)
where
import Data.Morpheus.Internal.Utils (elems)
import Data.Morpheus.Types.Internal.AST.Base
( DataTypeKind,
FieldName,
TypeName,
TypeRef (..),
hsTypeName,
)
import Data.Morpheus.Types.Internal.AST.Data
( ANY,
DataEnumValue (..),
FieldDefinition (..),
FieldsDefinition,
Meta,
TypeDefinition,
)
toHSFieldDefinition :: FieldDefinition cat -> FieldDefinition cat
toHSFieldDefinition field@FieldDefinition {fieldType = tyRef@TypeRef {typeConName}} =
field
{ fieldType = tyRef {typeConName = hsTypeName typeConName}
}
data GQLTypeD = GQLTypeD
{ typeD :: TypeD,
typeArgD :: [TypeD],
typeOriginal :: TypeDefinition ANY
}
deriving (Show)
data TypeD = TypeD
{ tName :: TypeName,
tNamespace :: [FieldName],
tCons :: [ConsD],
tKind :: DataTypeKind,
tMeta :: Maybe Meta
}
deriving (Show)
data ConsD = ConsD
{ cName :: TypeName,
cFields :: [FieldDefinition ANY]
}
deriving (Show)
mkCons :: TypeName -> FieldsDefinition cat -> ConsD
mkCons typename fields =
ConsD
{ cName = hsTypeName typename,
cFields = map (toHSFieldDefinition . mockFieldDefinition) (elems fields)
}
isEnum :: [ConsD] -> Bool
isEnum = all (null . cFields)
mockFieldDefinition :: FieldDefinition a -> FieldDefinition b
mockFieldDefinition FieldDefinition {..} = FieldDefinition {..}
mkConsEnum :: DataEnumValue -> ConsD
mkConsEnum DataEnumValue {enumName} = ConsD {cName = hsTypeName enumName, cFields = []}