content: {-# LANGUAGE DuplicateRecordFields #-}
  {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE NamedFieldPuns #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE QuasiQuotes #-}
  {-# LANGUAGE RecordWildCards #-}
  {-# LANGUAGE TemplateHaskellQuotes #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  
  module Data.Morpheus.Schema.DSL (dsl) where
  
  import Data.ByteString.Lazy.Char8
    ( ByteString,
      pack,
    )
  import Data.Morpheus.Error
    ( gqlWarnings,
      renderGQLErrors,
    )
  import Data.Morpheus.Ext.Result
    ( Result (..),
    )
  import Data.Morpheus.Parsing.Document.TypeSystem
    ( parseSchemaWithoutValidation,
    )
  import Language.Haskell.TH
  import Language.Haskell.TH.Quote
  import Relude hiding (ByteString)
  
  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 :: ByteString -> Q Exp
  dslExpression doc = case parseSchemaWithoutValidation doc of
    Failure errors -> fail (renderGQLErrors errors)
    Success {result, warnings} -> gqlWarnings warnings >> [|result|]
  