{-# LANGUAGE DataKinds #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Morpheus.Client.Build
( defineQuery,
)
where
--
-- MORPHEUS
import Data.Morpheus.Client.Declare.Client
( declareClient,
)
import Data.Morpheus.Client.Internal.Types
( ClientDefinition (..),
)
import Data.Morpheus.Client.Transform.Selection
( toClientDefinition,
)
import Data.Morpheus.Core
( Config (..),
VALIDATION_MODE (..),
validateRequest,
)
import Data.Morpheus.Error
( gqlWarnings,
renderGQLErrors,
)
import Data.Morpheus.Internal.Ext
( GQLResult,
Result (..),
)
import Data.Morpheus.Types.Internal.AST
( ExecutableDocument (..),
Operation (..),
Schema,
VALID,
)
import Language.Haskell.TH
import Relude
defineQuery :: IO (GQLResult (Schema VALID)) -> (ExecutableDocument, String) -> Q [Dec]
defineQuery ioSchema (query, src) = do
schema <- runIO ioSchema
case schema >>= (`validateWith` query) of
Failure errors -> fail (renderGQLErrors errors)
Success
{ result,
warnings
} -> gqlWarnings warnings >> declareClient src result
validateWith :: Schema VALID -> ExecutableDocument -> GQLResult ClientDefinition
validateWith
schema
rawRequest@ExecutableDocument
{ operation = Operation {operationArguments}
} = do
validOperation <- validateRequest Config {debug = False, validationMode = WITHOUT_VARIABLES} schema rawRequest
toClientDefinition
schema
operationArguments
validOperation