{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NoImplicitPrelude #-} module Data.Morpheus.Client ( gql, Fetch (..), FetchError(..), defineQuery, defineByDocument, defineByDocumentFile, defineByDocumentFile', defineByIntrospection, defineByIntrospectionFile, defineByIntrospectionFile', ScalarValue (..), DecodeScalar (..), EncodeScalar (..), ID (..), ) where import Data.ByteString.Lazy (ByteString) import qualified Data.ByteString.Lazy as L ( readFile, ) import Data.Morpheus.Client.Build ( defineQuery, ) import Data.Morpheus.Client.Fetch ( Fetch (..), ) import Data.Morpheus.Client.JSONSchema.Parse ( decodeIntrospection, ) import Data.Morpheus.Client.Internal.Types ( FetchError(..), ) import Data.Morpheus.Core ( parseFullSchema, ) import Data.Morpheus.Internal.Ext ( GQLResult, ) import Data.Morpheus.QuasiQuoter (gql) import Data.Morpheus.Types.GQLScalar ( DecodeScalar (..), EncodeScalar (..), ) import Data.Morpheus.Types.ID (ID (..)) import Data.Morpheus.Types.Internal.AST ( ExecutableDocument, ScalarValue (..), Schema, VALID, ) import Language.Haskell.TH import Language.Haskell.TH.Syntax ( qAddDependentFile, ) import Relude hiding (ByteString) defineByDocumentFile :: FilePath -> (ExecutableDocument, String) -> Q [Dec] defineByDocumentFile filePath args = do qAddDependentFile filePath defineByDocument (L.readFile filePath) args -- | This variant exposes 'Q FilePath' enabling the use of TH to generate the 'FilePath'. For example, https://hackage.haskell.org/package/file-embed-0.0.13.0/docs/Data-FileEmbed.html#v:makeRelativeToProject can be used to handle multi package projects more reliably. defineByDocumentFile' :: Q FilePath -> (ExecutableDocument, String) -> Q [Dec] defineByDocumentFile' qFilePath args = qFilePath >>= flip defineByDocumentFile args defineByIntrospectionFile :: FilePath -> (ExecutableDocument, String) -> Q [Dec] defineByIntrospectionFile filePath args = do qAddDependentFile filePath defineByIntrospection (L.readFile filePath) args -- | This variant exposes 'Q FilePath' enabling the use of TH to generate the 'FilePath'. For example, https://hackage.haskell.org/package/file-embed-0.0.13.0/docs/Data-FileEmbed.html#v:makeRelativeToProject can be used to handle multi package projects more reliably. defineByIntrospectionFile' :: Q FilePath -> (ExecutableDocument, String) -> Q [Dec] defineByIntrospectionFile' qFilePath args = qFilePath >>= flip defineByIntrospectionFile args defineByDocument :: IO ByteString -> (ExecutableDocument, String) -> Q [Dec] defineByDocument doc = defineQuery (schemaByDocument doc) schemaByDocument :: IO ByteString -> IO (GQLResult (Schema VALID)) schemaByDocument = fmap parseFullSchema defineByIntrospection :: IO ByteString -> (ExecutableDocument, String) -> Q [Dec] defineByIntrospection json = defineQuery (decodeIntrospection <$> json)