morpheus-graphql-code-gen-0.23.0: src/Data/Morpheus/CodeGen/Server/Printing/TH.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Morpheus.CodeGen.Server.Printing.TH
( compileDocument,
gqlDocument,
)
where
import Data.ByteString.Lazy.Char8 (ByteString, pack)
import Data.Morpheus.CodeGen.Server.Internal.AST
( CodeGenConfig (..),
ServerDeclaration (..),
)
import Data.Morpheus.CodeGen.Server.Interpreting.Transform
( parseServerTypeDefinitions,
)
import Data.Morpheus.CodeGen.TH
( PrintDec (..),
)
import Language.Haskell.TH
import Language.Haskell.TH.Quote (QuasiQuoter (..))
import Relude hiding (ByteString, Type)
gqlDocument :: QuasiQuoter
gqlDocument = mkQuasiQuoter CodeGenConfig {namespace = False}
mkQuasiQuoter :: CodeGenConfig -> QuasiQuoter
mkQuasiQuoter ctx =
QuasiQuoter
{ quoteExp = notHandled "Expressions",
quotePat = notHandled "Patterns",
quoteType = notHandled "Types",
quoteDec = compileDocument ctx . pack
}
where
notHandled things =
error $ things <> " are not supported by the GraphQL QuasiQuoter"
compileDocument :: CodeGenConfig -> ByteString -> Q [Dec]
compileDocument config =
parseServerTypeDefinitions config
>=> fmap concat . traverse printServerDec
printServerDec :: ServerDeclaration -> Q [Dec]
printServerDec (InterfaceType interface) = pure <$> printDec interface
printServerDec ScalarType {} = pure []
printServerDec (DataType dataType) = pure <$> printDec dataType
printServerDec (GQLTypeInstance _ gql) = pure <$> printDec gql
printServerDec (GQLDirectiveInstance dir) = pure <$> printDec dir