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

module Data.Morpheus.Parsing.Internal.Arguments (maybeArguments) where

-- MORPHEUS
import Data.Morpheus.Parsing.Internal.Internal
  ( Parser,
    getLocation,
  )
import Data.Morpheus.Parsing.Internal.Terms
  ( colon,
    parseName,
    uniqTupleOpt,
  )
import Data.Morpheus.Parsing.Internal.Value
  ( Parse (..),
  )
import Data.Morpheus.Types.Internal.AST
  ( Argument (..),
    Arguments,
    Value,
  )
import Relude
import Text.Megaparsec (label)

-- Arguments : https://graphql.github.io/graphql-spec/June2018/#sec-Language.Arguments
--
-- Arguments[Const]
-- ( Argument[Const](list) )
--
-- Argument[Const]
--  Name : Value[Const]
valueArgument :: Parse (Value s) => Parser (Argument s)
valueArgument :: Parser (Argument s)
valueArgument =
  String -> Parser (Argument s) -> Parser (Argument s)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
String -> m a -> m a
label String
"Argument" (Parser (Argument s) -> Parser (Argument s))
-> Parser (Argument s) -> Parser (Argument s)
forall a b. (a -> b) -> a -> b
$
    Position -> FieldName -> Value s -> Argument s
forall (valid :: Stage).
Position -> FieldName -> Value valid -> Argument valid
Argument
      (Position -> FieldName -> Value s -> Argument s)
-> ParsecT MyError ByteString GQLResult Position
-> ParsecT
     MyError ByteString GQLResult (FieldName -> Value s -> Argument s)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT MyError ByteString GQLResult Position
getLocation
      ParsecT
  MyError ByteString GQLResult (FieldName -> Value s -> Argument s)
-> ParsecT MyError ByteString GQLResult FieldName
-> ParsecT MyError ByteString GQLResult (Value s -> Argument s)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (ParsecT MyError ByteString GQLResult FieldName
forall (t :: NAME). Parser (Name t)
parseName ParsecT MyError ByteString GQLResult FieldName
-> ParsecT MyError ByteString GQLResult ()
-> ParsecT MyError ByteString GQLResult FieldName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT MyError ByteString GQLResult ()
colon)
      ParsecT MyError ByteString GQLResult (Value s -> Argument s)
-> ParsecT MyError ByteString GQLResult (Value s)
-> Parser (Argument s)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT MyError ByteString GQLResult (Value s)
forall a. Parse a => Parser a
parse
{-# INLINEABLE valueArgument #-}

maybeArguments :: Parse (Value s) => Parser (Arguments s)
maybeArguments :: Parser (Arguments s)
maybeArguments =
  String -> Parser (Arguments s) -> Parser (Arguments s)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
String -> m a -> m a
label String
"Arguments" (Parser (Arguments s) -> Parser (Arguments s))
-> Parser (Arguments s) -> Parser (Arguments s)
forall a b. (a -> b) -> a -> b
$
    Parser (Argument s) -> Parser (Arguments s)
forall (map :: * -> * -> *) k a.
(FromList GQLResult map k a, Empty (map k a), KeyOf k a) =>
Parser a -> Parser (map k a)
uniqTupleOpt Parser (Argument s)
forall (s :: Stage). Parse (Value s) => Parser (Argument s)
valueArgument
{-# INLINEABLE maybeArguments #-}