{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
module Data.Morpheus.Parsing.Internal.Create
( createField
, createArgument
, createType
, createScalarType
, createEnumType
, createUnionType
, createDataTypeLib
) where
import Data.Morpheus.Types.Internal.Data (DataField (..), DataFingerprint (..), DataFullType (..),
DataLeaf (..), DataType (..), DataTypeLib (..), DataTypeWrapper,
DataValidator (..), defineType, initTypeLib)
import Data.Text (Text)
createField :: a -> Text -> ([DataTypeWrapper], Text) -> DataField a
createField fieldArgs fieldName (fieldTypeWrappers, fieldType) =
DataField {fieldArgs, fieldName, fieldType, fieldTypeWrappers, fieldHidden = False}
createArgument :: Text -> ([DataTypeWrapper], Text) -> (Text, DataField ())
createArgument fieldName x = (fieldName, createField () fieldName x)
createType :: Text -> a -> DataType a
createType typeName typeData =
DataType {typeName, typeDescription = "", typeFingerprint = SystemFingerprint "", typeVisibility = True, typeData}
createScalarType :: Text -> (Text, DataFullType)
createScalarType typeName = (typeName, Leaf $ CustomScalar $ createType typeName (DataValidator pure))
createEnumType :: Text -> [Text] -> (Text, DataFullType)
createEnumType typeName typeData = (typeName, Leaf $ LeafEnum $ createType typeName typeData)
createUnionType :: Text -> [Text] -> (Text, DataFullType)
createUnionType typeName typeData = (typeName, Union $ createType typeName $ map unionField typeData)
where
unionField fieldType = createField () "" ([], fieldType)
createDataTypeLib :: Monad m => [(Text, DataFullType)] -> m DataTypeLib
createDataTypeLib types =
case takeByKey "Query" types of
(Just query, lib1) ->
case takeByKey "Mutation" lib1 of
(mutation, lib2) ->
case takeByKey "Subscription" lib2 of
(subscription, lib3) -> pure ((foldr defineType (initTypeLib query) lib3) {mutation, subscription})
_ -> fail "Query Not Defined"
where
takeByKey key lib =
case lookup key lib of
Just (OutputObject value) -> (Just (key, value), filter ((/= key) . fst) lib)
_ -> (Nothing, lib)