{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Data.Morpheus.Schema.DSL (dsl) where
import Data.Morpheus.Error
( gqlWarnings,
renderGQLErrors,
)
import Data.Morpheus.Parsing.Document.TypeSystem (parseSchema)
import Data.Morpheus.Types.Internal.AST (ANY, TypeDefinition)
import Data.Morpheus.Types.Internal.Resolving
( Eventless,
Result (..),
)
import Data.Text
( Text,
pack,
)
import Language.Haskell.TH
import Language.Haskell.TH.Quote
dsl :: QuasiQuoter
dsl =
QuasiQuoter
{ quoteExp = dslExpression . pack,
quotePat = notHandled "Patterns",
quoteType = notHandled "Types",
quoteDec = notHandled "Declarations"
}
where
notHandled things =
error $ things ++ " are not supported by the GraphQL QuasiQuoter"
dslExpression :: Text -> Q Exp
dslExpression doc = case (parseSchema doc :: Eventless [TypeDefinition ANY]) of
Failure errors -> fail (renderGQLErrors errors)
Success {result, warnings} ->
gqlWarnings warnings >> [|result|]