{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.CodeGen.Server
  ( CodeGenConfig (..),
    PrinterConfig (..),
    gqlDocument,
    importServerTypeDefinitions,
  )
where

import Data.ByteString.Lazy.Char8
  ( readFile,
  )
import Data.FileEmbed (makeRelativeToProject)
import Data.Morpheus.CodeGen.Server.Internal.AST
  ( CodeGenConfig (..),
  )
import Data.Morpheus.CodeGen.Server.Printing.TH
  ( compileDocument,
    gqlDocument,
  )
import Language.Haskell.TH (Dec, Q, runIO)
import Language.Haskell.TH.Syntax
  ( qAddDependentFile,
  )
import Relude hiding (ByteString, readFile)

newtype PrinterConfig = PrinterConfig
  { PrinterConfig -> String
moduleName :: String
  }

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