{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Morpheus.Parsing.Request.Parser
( parseRequest,
)
where
import qualified Data.Aeson as Aeson
( Value (..),
)
import Data.HashMap.Lazy (toList)
import Data.Morpheus.Ext.Result
( Eventless,
)
import Data.Morpheus.Ext.SafeHashMap (unsafeFromList)
import Data.Morpheus.Internal.Utils
( empty,
fromElems,
toLBS,
)
import Data.Morpheus.Parsing.Internal.Internal
( Parser,
processParser,
)
import Data.Morpheus.Parsing.Internal.Terms
( ignoredTokens,
)
import Data.Morpheus.Parsing.Request.Operation
( parseOperation,
)
import Data.Morpheus.Parsing.Request.Selection
( parseFragmentDefinition,
)
import Data.Morpheus.Types.IO (GQLRequest (..))
import Data.Morpheus.Types.Internal.AST
( ExecutableDocument (..),
FieldName (..),
Variables,
replaceValue,
)
import Relude hiding
( empty,
fromList,
many,
toList,
)
import Text.Megaparsec
( eof,
label,
many,
)
parseExecutableDocument :: Variables -> Parser ExecutableDocument
parseExecutableDocument :: Variables -> Parser ExecutableDocument
parseExecutableDocument Variables
variables =
String -> Parser ExecutableDocument -> Parser ExecutableDocument
forall e s (m :: * -> *) a.
MonadParsec e s m =>
String -> m a -> m a
label String
"ExecutableDocument" (Parser ExecutableDocument -> Parser ExecutableDocument)
-> Parser ExecutableDocument -> Parser ExecutableDocument
forall a b. (a -> b) -> a -> b
$
( Variables -> Operation RAW -> Fragments RAW -> ExecutableDocument
ExecutableDocument Variables
variables
(Operation RAW -> Fragments RAW -> ExecutableDocument)
-> ParsecT MyError ByteString Eventless (Operation RAW)
-> ParsecT
MyError ByteString Eventless (Fragments RAW -> ExecutableDocument)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
ignoredTokens Parser ()
-> ParsecT MyError ByteString Eventless (Operation RAW)
-> ParsecT MyError ByteString Eventless (Operation RAW)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT MyError ByteString Eventless (Operation RAW)
parseOperation)
ParsecT
MyError ByteString Eventless (Fragments RAW -> ExecutableDocument)
-> ParsecT MyError ByteString Eventless (Fragments RAW)
-> Parser ExecutableDocument
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (ParsecT MyError ByteString Eventless (Fragment RAW)
-> ParsecT MyError ByteString Eventless [Fragment RAW]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many ParsecT MyError ByteString Eventless (Fragment RAW)
parseFragmentDefinition ParsecT MyError ByteString Eventless [Fragment RAW]
-> ([Fragment RAW]
-> ParsecT MyError ByteString Eventless (Fragments RAW))
-> ParsecT MyError ByteString Eventless (Fragments RAW)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Eventless (Fragments RAW)
-> ParsecT MyError ByteString Eventless (Fragments RAW)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Eventless (Fragments RAW)
-> ParsecT MyError ByteString Eventless (Fragments RAW))
-> ([Fragment RAW] -> Eventless (Fragments RAW))
-> [Fragment RAW]
-> ParsecT MyError ByteString Eventless (Fragments RAW)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Fragment RAW] -> Eventless (Fragments RAW)
forall k (m :: k -> *) a (coll :: k).
FromElems m a coll =>
[a] -> m coll
fromElems)
)
Parser ExecutableDocument -> Parser () -> Parser ExecutableDocument
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
ignoredTokens
Parser ExecutableDocument -> Parser () -> Parser ExecutableDocument
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof
parseRequest :: GQLRequest -> Eventless ExecutableDocument
parseRequest :: GQLRequest -> Eventless ExecutableDocument
parseRequest GQLRequest {Text
query :: GQLRequest -> Text
query :: Text
query, Maybe Value
variables :: GQLRequest -> Maybe Value
variables :: Maybe Value
variables} =
Parser ExecutableDocument
-> ByteString -> Eventless ExecutableDocument
forall a. Parser a -> ByteString -> Eventless a
processParser
(Variables -> Parser ExecutableDocument
parseExecutableDocument (Variables -> Parser ExecutableDocument)
-> Variables -> Parser ExecutableDocument
forall a b. (a -> b) -> a -> b
$ Maybe Value -> Variables
toVariables Maybe Value
variables)
(Text -> ByteString
toLBS Text
query)
where
toVariables :: Maybe Aeson.Value -> Variables
toVariables :: Maybe Value -> Variables
toVariables (Just (Aeson.Object Object
x)) = [(FieldName, Value CONST)] -> Variables
forall k a. (Eq k, Hashable k) => [(k, a)] -> SafeHashMap k a
unsafeFromList ([(FieldName, Value CONST)] -> Variables)
-> [(FieldName, Value CONST)] -> Variables
forall a b. (a -> b) -> a -> b
$ (Text, Value) -> (FieldName, Value CONST)
forall (a :: Stage). (Text, Value) -> (FieldName, Value a)
toMorpheusValue ((Text, Value) -> (FieldName, Value CONST))
-> [(Text, Value)] -> [(FieldName, Value CONST)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object -> [(Text, Value)]
forall k v. HashMap k v -> [(k, v)]
toList Object
x
where
toMorpheusValue :: (Text, Value) -> (FieldName, Value a)
toMorpheusValue (Text
key, Value
value) = (Text -> FieldName
FieldName Text
key, Value -> Value a
forall (a :: Stage). Value -> Value a
replaceValue Value
value)
toVariables Maybe Value
_ = Variables
forall coll. Empty coll => coll
empty