{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Document
  ( toGraphQLDocument,
    gqlDocument,
    importGQLDocument,
    importGQLDocumentWithNamespace,
    RootResolverConstraint,
  )
where

import Data.ByteString.Lazy.Char8
  ( ByteString,
    readFile,
  )
import Data.Morpheus.CodeGen.Internal.AST
  ( CodeGenConfig (..),
  )
import Data.Morpheus.Server
  ( RootResolverConstraint,
    printSchema,
  )
import Data.Morpheus.Server.TH.Compile
  ( compileDocument,
    gqlDocument,
  )
import Data.Morpheus.Types (RootResolver)
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
  ( qAddDependentFile,
  )
import Relude hiding (ByteString, readFile)

importDeclarations :: CodeGenConfig -> FilePath -> Q [Dec]
importDeclarations :: CodeGenConfig -> FilePath -> Q [Dec]
importDeclarations CodeGenConfig
ctx FilePath
src = do
  FilePath -> Q ()
forall (m :: * -> *). Quasi m => FilePath -> m ()
qAddDependentFile FilePath
src
  IO ByteString -> Q ByteString
forall a. IO a -> Q a
runIO (FilePath -> IO ByteString
readFile FilePath
src)
    Q ByteString -> (ByteString -> Q [Dec]) -> Q [Dec]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CodeGenConfig -> ByteString -> Q [Dec]
compileDocument CodeGenConfig
ctx

importGQLDocument :: FilePath -> Q [Dec]
importGQLDocument :: FilePath -> Q [Dec]
importGQLDocument =
  CodeGenConfig -> FilePath -> Q [Dec]
importDeclarations CodeGenConfig :: Bool -> CodeGenConfig
CodeGenConfig {namespace :: Bool
namespace = Bool
False}

importGQLDocumentWithNamespace :: FilePath -> Q [Dec]
importGQLDocumentWithNamespace :: FilePath -> Q [Dec]
importGQLDocumentWithNamespace =
  CodeGenConfig -> FilePath -> Q [Dec]
importDeclarations CodeGenConfig :: Bool -> CodeGenConfig
CodeGenConfig {namespace :: Bool
namespace = Bool
True}

{-# DEPRECATED toGraphQLDocument "use Data.Morpheus.Server.printSchema" #-}
toGraphQLDocument ::
  RootResolverConstraint m event query mut sub =>
  proxy (RootResolver m event query mut sub) ->
  ByteString
toGraphQLDocument :: proxy (RootResolver m event query mut sub) -> ByteString
toGraphQLDocument = proxy (RootResolver m event query mut sub) -> ByteString
forall (m :: * -> *) event (query :: (* -> *) -> *)
       (mut :: (* -> *) -> *) (sub :: (* -> *) -> *) (proxy :: * -> *).
RootResolverConstraint m event query mut sub =>
proxy (RootResolver m event query mut sub) -> ByteString
printSchema