module Miso.GraphQL.Parser where

import Control.Applicative (Alternative (empty, many), optional, (<|>))
import Control.Monad (guard)
import Data.Containers.ListUtils (nubOrdOn)
import Data.Foldable (toList)
import Data.Functor (void)
import Data.List.NonEmpty (NonEmpty, some1)
import Data.List.NonEmpty qualified as NonEmpty
import Miso.GraphQL.AST
import Miso.GraphQL.Lexer (Token (..), lex)
import Miso.Prelude hiding (lex)
import Miso.Util.Lexer (Lexer)
import Miso.Util.Parser

parse'
    :: Lexer [token]
    -> Parser token a
    -> MisoString
    -> Either (ParseError a token) a
parse' :: forall token a.
Lexer [token]
-> Parser token a -> MisoString -> Either (ParseError a token) a
parse' Lexer [token]
lexer Parser token a
parser = (LexerError -> Either (ParseError a token) a)
-> ([token] -> Either (ParseError a token) a)
-> Either LexerError [token]
-> Either (ParseError a token) a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (ParseError a token -> Either (ParseError a token) a
forall a b. a -> Either a b
Left (ParseError a token -> Either (ParseError a token) a)
-> (LexerError -> ParseError a token)
-> LexerError
-> Either (ParseError a token) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. LexerError -> ParseError a token
forall a token. LexerError -> ParseError a token
LexicalError) (Parser token a -> [token] -> Either (ParseError a token) a
forall token a.
Parser token a -> [token] -> Either (ParseError a token) a
parse Parser token a
parser) (Either LexerError [token] -> Either (ParseError a token) a)
-> (MisoString -> Either LexerError [token])
-> MisoString
-> Either (ParseError a token) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Lexer [token] -> MisoString -> Either LexerError [token]
forall a. Lexer a -> MisoString -> Either LexerError a
lex Lexer [token]
lexer

punctuator :: Char -> Parser Token ()
punctuator :: Char -> Parser Token ()
punctuator = ParserT () [Token] [] Token -> Parser Token ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParserT () [Token] [] Token -> Parser Token ())
-> (Char -> ParserT () [Token] [] Token) -> Char -> Parser Token ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Token -> ParserT () [Token] [] Token
forall token. Eq token => token -> Parser token token
token_ (Token -> ParserT () [Token] [] Token)
-> (Char -> Token) -> Char -> ParserT () [Token] [] Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Char -> Token
TokenPunctuator

keyword :: MisoString -> Parser Token ()
keyword :: MisoString -> Parser Token ()
keyword = ParserT () [Token] [] Token -> Parser Token ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParserT () [Token] [] Token -> Parser Token ())
-> (MisoString -> ParserT () [Token] [] Token)
-> MisoString
-> Parser Token ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Token -> ParserT () [Token] [] Token
forall token. Eq token => token -> Parser token token
token_ (Token -> ParserT () [Token] [] Token)
-> (MisoString -> Token)
-> MisoString
-> ParserT () [Token] [] Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Name -> Token
TokenName (Name -> Token) -> (MisoString -> Name) -> MisoString -> Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. MisoString -> Name
Name

enclosed' :: Char -> Char -> Parser Token a -> Parser Token a
enclosed' :: forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
a Char
b = Parser Token ()
-> Parser Token ()
-> ParserT () [Token] [] a
-> ParserT () [Token] [] a
forall (f :: * -> *) a b c.
Applicative f =>
f a -> f b -> f c -> f c
enclosed (Char -> Parser Token ()
punctuator Char
a) (Char -> Parser Token ()
punctuator Char
b)

uniqueOn
    :: (Foldable f, Ord b)
    => (a -> b)
    -> Parser Token (f a)
    -> Parser Token (f a)
uniqueOn :: forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn a -> b
f Parser Token (f a)
p = do
    f a
as <- Parser Token (f a)
p
    let numAs :: Int
numAs = f a -> Int
forall a. f a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length f a
as
        numBs :: Int
numBs = [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([a] -> Int) -> (f a -> [a]) -> f a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (a -> b) -> [a] -> [a]
forall b a. Ord b => (a -> b) -> [a] -> [a]
nubOrdOn a -> b
f ([a] -> [a]) -> (f a -> [a]) -> f a -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. f a -> [a]
forall a. f a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList (f a -> Int) -> f a -> Int
forall a b. (a -> b) -> a -> b
$ f a
as
    Bool -> Parser Token ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Parser Token ()) -> Bool -> Parser Token ()
forall a b. (a -> b) -> a -> b
$ Int
numAs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
numBs
    pure f a
as

sepBy1' :: Char -> Parser Token a -> Parser Token (NonEmpty a)
sepBy1' :: forall a. Char -> Parser Token a -> Parser Token (NonEmpty a)
sepBy1' = (ParserT () [Token] [] [a] -> Parser Token (NonEmpty a))
-> (Parser Token a -> ParserT () [Token] [] [a])
-> Parser Token a
-> Parser Token (NonEmpty a)
forall a b.
(a -> b) -> (Parser Token a -> a) -> Parser Token a -> b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([a] -> NonEmpty a)
-> ParserT () [Token] [] [a] -> Parser Token (NonEmpty a)
forall a b.
(a -> b) -> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> NonEmpty a
forall a. HasCallStack => [a] -> NonEmpty a
NonEmpty.fromList) ((Parser Token a -> ParserT () [Token] [] [a])
 -> Parser Token a -> Parser Token (NonEmpty a))
-> (Char -> Parser Token a -> ParserT () [Token] [] [a])
-> Char
-> Parser Token a
-> Parser Token (NonEmpty a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Parser Token () -> Parser Token a -> ParserT () [Token] [] [a]
forall (m :: * -> *) sep a. Alternative m => m sep -> m a -> m [a]
sepBy1 (Parser Token () -> Parser Token a -> ParserT () [Token] [] [a])
-> (Char -> Parser Token ())
-> Char
-> Parser Token a
-> ParserT () [Token] [] [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Char -> Parser Token ()
punctuator

lookaheadCantBe :: (Eq token) => token -> a -> Parser token a
lookaheadCantBe :: forall token a. Eq token => token -> a -> Parser token a
lookaheadCantBe token
token a
a = do
    Bool -> ParserT () [token] [] ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> ParserT () [token] [] ())
-> (Maybe token -> Bool) -> Maybe token -> ParserT () [token] [] ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (token -> Maybe token
forall a. a -> Maybe a
Just token
token Maybe token -> Maybe token -> Bool
forall a. Eq a => a -> a -> Bool
/=) (Maybe token -> ParserT () [token] [] ())
-> ParserT () [token] [] (Maybe token) -> ParserT () [token] [] ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ParserT () [token] [] token -> ParserT () [token] [] (Maybe token)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [token] [] token
forall a. Parser a a
peek
    pure a
a

lookaheadCantBe' :: Char -> a -> Parser Token a
lookaheadCantBe' :: forall a. Char -> a -> Parser Token a
lookaheadCantBe' = Token -> a -> Parser Token a
forall token a. Eq token => token -> a -> Parser token a
lookaheadCantBe (Token -> a -> Parser Token a)
-> (Char -> Token) -> Char -> a -> Parser Token a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Char -> Token
TokenPunctuator

nextToken :: ParserT () [a] [] a
nextToken :: forall a. Parser a a
nextToken =  (a -> Bool) -> ParserT () [a] [] a
forall a r. (a -> Bool) -> ParserT r [a] [] a
satisfy ((a -> Bool) -> ParserT () [a] [] a)
-> (a -> Bool) -> ParserT () [a] [] a
forall a b. (a -> b) -> a -> b
$ Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True

-- | https://spec.graphql.org/draft/#Document
document :: Parser Token Document
document :: Parser Token Document
document =  NonEmpty Definition -> Document
Document (NonEmpty Definition -> Document)
-> ParserT () [Token] [] (NonEmpty Definition)
-> Parser Token Document
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Definition
-> ParserT () [Token] [] (NonEmpty Definition)
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 ParserT () [Token] [] Definition
definition

-- | https://spec.graphql.org/draft/#Definition
definition :: Parser Token Definition
definition :: ParserT () [Token] [] Definition
definition =
     [ParserT () [Token] [] Definition]
-> ParserT () [Token] [] Definition
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ ExecutableDefinition -> Definition
DefinitionExecutable (ExecutableDefinition -> Definition)
-> ParserT () [Token] [] ExecutableDefinition
-> ParserT () [Token] [] Definition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] ExecutableDefinition
executableDefinition
            , TypeSystemDefinition -> Definition
DefinitionTypeSystem (TypeSystemDefinition -> Definition)
-> ParserT () [Token] [] TypeSystemDefinition
-> ParserT () [Token] [] Definition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] TypeSystemDefinition
typeSystemDefinition
            , TypeSystemExtension -> Definition
ExtensionTypeSystem (TypeSystemExtension -> Definition)
-> ParserT () [Token] [] TypeSystemExtension
-> ParserT () [Token] [] Definition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] TypeSystemExtension
typeSystemExtension
            ]

-- https://spec.graphql.org/draft/#ExecutableDefinition
executableDefinition :: Parser Token ExecutableDefinition
executableDefinition :: ParserT () [Token] [] ExecutableDefinition
executableDefinition =
     [ParserT () [Token] [] ExecutableDefinition]
-> ParserT () [Token] [] ExecutableDefinition
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ OperationDefinition -> ExecutableDefinition
DefinitionOperation (OperationDefinition -> ExecutableDefinition)
-> ParserT () [Token] [] OperationDefinition
-> ParserT () [Token] [] ExecutableDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] OperationDefinition
operationDefinition
            , FragmentDefinition -> ExecutableDefinition
DefinitionFragment (FragmentDefinition -> ExecutableDefinition)
-> ParserT () [Token] [] FragmentDefinition
-> ParserT () [Token] [] ExecutableDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] FragmentDefinition
fragmentDefinition
            ]

-- | A GraphQL 'OperationDefinition'
-- https://spec.graphql.org/draft/#OperationDefinition
operationDefinition :: Parser Token OperationDefinition
operationDefinition :: ParserT () [Token] [] OperationDefinition
operationDefinition =
     [ParserT () [Token] [] OperationDefinition]
-> ParserT () [Token] [] OperationDefinition
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ SelectionSet -> OperationDefinition
AnonymousQuery (SelectionSet -> OperationDefinition)
-> ParserT () [Token] [] SelectionSet
-> ParserT () [Token] [] OperationDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] SelectionSet
selectionSet
            , Maybe Description
-> OperationType
-> Maybe Name
-> Maybe VariablesDefinition
-> Maybe Directives
-> SelectionSet
-> OperationDefinition
OperationDefinition
                (Maybe Description
 -> OperationType
 -> Maybe Name
 -> Maybe VariablesDefinition
 -> Maybe Directives
 -> SelectionSet
 -> OperationDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (OperationType
      -> Maybe Name
      -> Maybe VariablesDefinition
      -> Maybe Directives
      -> SelectionSet
      -> OperationDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
                ParserT
  ()
  [Token]
  []
  (OperationType
   -> Maybe Name
   -> Maybe VariablesDefinition
   -> Maybe Directives
   -> SelectionSet
   -> OperationDefinition)
-> ParserT () [Token] [] OperationType
-> ParserT
     ()
     [Token]
     []
     (Maybe Name
      -> Maybe VariablesDefinition
      -> Maybe Directives
      -> SelectionSet
      -> OperationDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] OperationType
operationType
                ParserT
  ()
  [Token]
  []
  (Maybe Name
   -> Maybe VariablesDefinition
   -> Maybe Directives
   -> SelectionSet
   -> OperationDefinition)
-> ParserT () [Token] [] (Maybe Name)
-> ParserT
     ()
     [Token]
     []
     (Maybe VariablesDefinition
      -> Maybe Directives -> SelectionSet -> OperationDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name -> ParserT () [Token] [] (Maybe Name)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Name
name
                ParserT
  ()
  [Token]
  []
  (Maybe VariablesDefinition
   -> Maybe Directives -> SelectionSet -> OperationDefinition)
-> ParserT () [Token] [] (Maybe VariablesDefinition)
-> ParserT
     ()
     [Token]
     []
     (Maybe Directives -> SelectionSet -> OperationDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] VariablesDefinition
-> ParserT () [Token] [] (Maybe VariablesDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] VariablesDefinition
variablesDefinition
                ParserT
  ()
  [Token]
  []
  (Maybe Directives -> SelectionSet -> OperationDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] (SelectionSet -> OperationDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
                ParserT () [Token] [] (SelectionSet -> OperationDefinition)
-> ParserT () [Token] [] SelectionSet
-> ParserT () [Token] [] OperationDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] SelectionSet
selectionSet
            ]

-- | A GraphQL 'Operation' type
-- https://spec.graphql.org/draft/#OperationType
operationType :: Parser Token OperationType
operationType :: ParserT () [Token] [] OperationType
operationType =
     [ParserT () [Token] [] OperationType]
-> ParserT () [Token] [] OperationType
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ OperationType
Query OperationType
-> Parser Token () -> ParserT () [Token] [] OperationType
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"query"
            , OperationType
Mutation OperationType
-> Parser Token () -> ParserT () [Token] [] OperationType
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"mutation"
            , OperationType
Subscription OperationType
-> Parser Token () -> ParserT () [Token] [] OperationType
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"subscription"
            ]

-- | A GraphQL 'SelectionSet'
-- https://spec.graphql.org/draft/#SelectionSet
selectionSet :: Parser Token SelectionSet
selectionSet :: ParserT () [Token] [] SelectionSet
selectionSet =  Char
-> Char
-> ParserT () [Token] [] SelectionSet
-> ParserT () [Token] [] SelectionSet
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'{' Char
'}' (ParserT () [Token] [] SelectionSet
 -> ParserT () [Token] [] SelectionSet)
-> ParserT () [Token] [] SelectionSet
-> ParserT () [Token] [] SelectionSet
forall a b. (a -> b) -> a -> b
$ ParserT () [Token] [] Selection
-> ParserT () [Token] [] SelectionSet
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 ParserT () [Token] [] Selection
selection

-- | A GraphQL 'Selection' type
-- https://spec.graphql.org/draft/#Selection
selection :: Parser Token Selection
selection :: ParserT () [Token] [] Selection
selection =
     [ParserT () [Token] [] Selection]
-> ParserT () [Token] [] Selection
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ Field -> Selection
SelectionField (Field -> Selection)
-> ParserT () [Token] [] Field -> ParserT () [Token] [] Selection
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Field
field
            , FragmentSpread -> Selection
SelectionFragmentSpread (FragmentSpread -> Selection)
-> ParserT () [Token] [] FragmentSpread
-> ParserT () [Token] [] Selection
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] FragmentSpread
fragmentSpread
            , InlineFragment -> Selection
SelectionInlineFragment (InlineFragment -> Selection)
-> ParserT () [Token] [] InlineFragment
-> ParserT () [Token] [] Selection
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] InlineFragment
inlineFragment
            ]

-- | A GraphQL 'Field' type
-- https://spec.graphql.org/draft/#Field
field :: Parser Token Field
field :: ParserT () [Token] [] Field
field =
     Maybe Alias
-> Name
-> Maybe Arguments
-> Maybe Directives
-> Maybe SelectionSet
-> Field
Field
        (Maybe Alias
 -> Name
 -> Maybe Arguments
 -> Maybe Directives
 -> Maybe SelectionSet
 -> Field)
-> ParserT () [Token] [] (Maybe Alias)
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe Arguments
      -> Maybe Directives
      -> Maybe SelectionSet
      -> Field)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Alias -> ParserT () [Token] [] (Maybe Alias)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Alias
alias
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe Arguments
   -> Maybe Directives
   -> Maybe SelectionSet
   -> Field)
-> ParserT () [Token] [] Name
-> ParserT
     ()
     [Token]
     []
     (Maybe Arguments
      -> Maybe Directives -> Maybe SelectionSet -> Field)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT
  ()
  [Token]
  []
  (Maybe Arguments
   -> Maybe Directives -> Maybe SelectionSet -> Field)
-> ParserT () [Token] [] (Maybe Arguments)
-> ParserT
     () [Token] [] (Maybe Directives -> Maybe SelectionSet -> Field)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Arguments
-> ParserT () [Token] [] (Maybe Arguments)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Arguments
arguments
        ParserT
  () [Token] [] (Maybe Directives -> Maybe SelectionSet -> Field)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] (Maybe SelectionSet -> Field)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
        ParserT () [Token] [] (Maybe SelectionSet -> Field)
-> ParserT () [Token] [] (Maybe SelectionSet)
-> ParserT () [Token] [] Field
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] SelectionSet
-> ParserT () [Token] [] (Maybe SelectionSet)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] SelectionSet
selectionSet

-- | A GraphQL 'Alias'
-- https://spec.graphql.org/draft/#Alias
alias :: Parser Token Alias
alias :: ParserT () [Token] [] Alias
alias =  Name -> Alias
Alias (Name -> Alias)
-> ParserT () [Token] [] Name -> ParserT () [Token] [] Alias
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Name
name ParserT () [Token] [] Alias
-> Parser Token () -> ParserT () [Token] [] Alias
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Token ()
punctuator Char
':'

-- | GraphQL 'Arguments'
-- https://spec.graphql.org/draft/#Arguments
arguments :: Parser Token Arguments
arguments :: ParserT () [Token] [] Arguments
arguments =
     Char
-> Char
-> ParserT () [Token] [] Arguments
-> ParserT () [Token] [] Arguments
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'(' Char
')'
        (ParserT () [Token] [] Arguments
 -> ParserT () [Token] [] Arguments)
-> (ParserT () [Token] [] Arguments
    -> ParserT () [Token] [] Arguments)
-> ParserT () [Token] [] Arguments
-> ParserT () [Token] [] Arguments
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Argument -> Name)
-> ParserT () [Token] [] Arguments
-> ParserT () [Token] [] Arguments
forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn Argument -> Name
argumentName
        (ParserT () [Token] [] Arguments
 -> ParserT () [Token] [] Arguments)
-> ParserT () [Token] [] Arguments
-> ParserT () [Token] [] Arguments
forall a b. (a -> b) -> a -> b
$ ParserT () [Token] [] Argument -> ParserT () [Token] [] Arguments
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 ParserT () [Token] [] Argument
argument

-- | A GraphQL 'Argument'
-- https://spec.graphql.org/draft/#Arguments
argument :: Parser Token Argument
argument :: ParserT () [Token] [] Argument
argument =  Name -> Value -> Argument
Argument (Name -> Value -> Argument)
-> ParserT () [Token] [] Name
-> ParserT () [Token] [] (Value -> Argument)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Name
name ParserT () [Token] [] (Value -> Argument)
-> Parser Token () -> ParserT () [Token] [] (Value -> Argument)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Token ()
punctuator Char
':' ParserT () [Token] [] (Value -> Argument)
-> ParserT () [Token] [] Value -> ParserT () [Token] [] Argument
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Value
value

-- | GraphQL 'FragmentSpread' type
-- https://spec.graphql.org/draft/#FragmentSpread
fragmentSpread :: Parser Token FragmentSpread
fragmentSpread :: ParserT () [Token] [] FragmentSpread
fragmentSpread =
     FragmentName -> Maybe Directives -> FragmentSpread
FragmentSpread
        (FragmentName -> Maybe Directives -> FragmentSpread)
-> ParserT () [Token] [] Token
-> ParserT
     () [Token] [] (FragmentName -> Maybe Directives -> FragmentSpread)
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> ParserT () [Token] [] Token
forall token. Eq token => token -> Parser token token
token_ Token
TokenEllipsis
        ParserT
  () [Token] [] (FragmentName -> Maybe Directives -> FragmentSpread)
-> ParserT () [Token] [] FragmentName
-> ParserT () [Token] [] (Maybe Directives -> FragmentSpread)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] FragmentName
fragmentName
        ParserT () [Token] [] (Maybe Directives -> FragmentSpread)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] FragmentSpread
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives

-- | GraphQL 'InlineFragment' type
-- https://spec.graphql.org/draft/#InlineFragment
inlineFragment :: Parser Token InlineFragment
inlineFragment :: ParserT () [Token] [] InlineFragment
inlineFragment =
     Maybe TypeCondition
-> Maybe Directives -> SelectionSet -> InlineFragment
InlineFragment
        (Maybe TypeCondition
 -> Maybe Directives -> SelectionSet -> InlineFragment)
-> ParserT () [Token] [] Token
-> ParserT
     ()
     [Token]
     []
     (Maybe TypeCondition
      -> Maybe Directives -> SelectionSet -> InlineFragment)
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> ParserT () [Token] [] Token
forall token. Eq token => token -> Parser token token
token_ Token
TokenEllipsis
        ParserT
  ()
  [Token]
  []
  (Maybe TypeCondition
   -> Maybe Directives -> SelectionSet -> InlineFragment)
-> ParserT () [Token] [] (Maybe TypeCondition)
-> ParserT
     () [Token] [] (Maybe Directives -> SelectionSet -> InlineFragment)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] TypeCondition
-> ParserT () [Token] [] (Maybe TypeCondition)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] TypeCondition
typeCondition
        ParserT
  () [Token] [] (Maybe Directives -> SelectionSet -> InlineFragment)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] (SelectionSet -> InlineFragment)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
        ParserT () [Token] [] (SelectionSet -> InlineFragment)
-> ParserT () [Token] [] SelectionSet
-> ParserT () [Token] [] InlineFragment
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] SelectionSet
selectionSet

-- | A GraphQL 'FragmentDefinition'
-- https://spec.graphql.org/draft/#FragmentDefinition
fragmentDefinition :: Parser Token FragmentDefinition
fragmentDefinition :: ParserT () [Token] [] FragmentDefinition
fragmentDefinition =
     Maybe Description
-> FragmentName
-> TypeCondition
-> Maybe Directives
-> SelectionSet
-> FragmentDefinition
FragmentDefinition
        (Maybe Description
 -> FragmentName
 -> TypeCondition
 -> Maybe Directives
 -> SelectionSet
 -> FragmentDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (FragmentName
      -> TypeCondition
      -> Maybe Directives
      -> SelectionSet
      -> FragmentDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (FragmentName
   -> TypeCondition
   -> Maybe Directives
   -> SelectionSet
   -> FragmentDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (FragmentName
      -> TypeCondition
      -> Maybe Directives
      -> SelectionSet
      -> FragmentDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"fragment"
        ParserT
  ()
  [Token]
  []
  (FragmentName
   -> TypeCondition
   -> Maybe Directives
   -> SelectionSet
   -> FragmentDefinition)
-> ParserT () [Token] [] FragmentName
-> ParserT
     ()
     [Token]
     []
     (TypeCondition
      -> Maybe Directives -> SelectionSet -> FragmentDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] FragmentName
fragmentName
        ParserT
  ()
  [Token]
  []
  (TypeCondition
   -> Maybe Directives -> SelectionSet -> FragmentDefinition)
-> ParserT () [Token] [] TypeCondition
-> ParserT
     ()
     [Token]
     []
     (Maybe Directives -> SelectionSet -> FragmentDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] TypeCondition
typeCondition
        ParserT
  ()
  [Token]
  []
  (Maybe Directives -> SelectionSet -> FragmentDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] (SelectionSet -> FragmentDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
        ParserT () [Token] [] (SelectionSet -> FragmentDefinition)
-> ParserT () [Token] [] SelectionSet
-> ParserT () [Token] [] FragmentDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] SelectionSet
selectionSet

-- | A GraphQL 'FragmentName'
-- https://spec.graphql.org/draft/#FragmentName
fragmentName :: Parser Token FragmentName
fragmentName :: ParserT () [Token] [] FragmentName
fragmentName =  Name -> FragmentName
FragmentName (Name -> FragmentName)
-> ParserT () [Token] [] Name -> ParserT () [Token] [] FragmentName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [MisoString] -> ParserT () [Token] [] Name
nameButNot [MisoString
"on"]

-- | A GraphQL 'TypeCondition'
-- https://spec.graphql.org/draft/#TypeCondition
typeCondition :: Parser Token TypeCondition
typeCondition :: ParserT () [Token] [] TypeCondition
typeCondition =  NamedType -> TypeCondition
TypeCondition (NamedType -> TypeCondition)
-> Parser Token ()
-> ParserT () [Token] [] (NamedType -> TypeCondition)
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"on" ParserT () [Token] [] (NamedType -> TypeCondition)
-> ParserT () [Token] [] NamedType
-> ParserT () [Token] [] TypeCondition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] NamedType
namedType

-- | A GraphQL 'Value'
-- https://spec.graphql.org/draft/#Value
value :: Parser Token Value
value :: ParserT () [Token] [] Value
value =
     [ParserT () [Token] [] Value] -> ParserT () [Token] [] Value
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ Variable -> Value
ValueVariable (Variable -> Value)
-> ParserT () [Token] [] Variable -> ParserT () [Token] [] Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Variable
variable
            , ParserT () [Token] [] Token
forall a. Parser a a
nextToken ParserT () [Token] [] Token
-> (Token -> ParserT () [Token] [] Value)
-> ParserT () [Token] [] Value
forall a b.
ParserT () [Token] [] a
-> (a -> ParserT () [Token] [] b) -> ParserT () [Token] [] b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
                TokenInt Int
i -> Value -> ParserT () [Token] [] Value
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> ParserT () [Token] [] Value)
-> Value -> ParserT () [Token] [] Value
forall a b. (a -> b) -> a -> b
$ Int -> Value
ValueInt Int
i
                TokenFloat Double
f -> Value -> ParserT () [Token] [] Value
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> ParserT () [Token] [] Value)
-> Value -> ParserT () [Token] [] Value
forall a b. (a -> b) -> a -> b
$ Double -> Value
ValueFloat Double
f
                TokenString StringValue
s -> Value -> ParserT () [Token] [] Value
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> ParserT () [Token] [] Value)
-> Value -> ParserT () [Token] [] Value
forall a b. (a -> b) -> a -> b
$ StringValue -> Value
ValueString StringValue
s
                Token
_ -> ParserT () [Token] [] Value
forall a. ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a
empty
            , Bool -> Value
ValueBoolean Bool
True Value -> Parser Token () -> ParserT () [Token] [] Value
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"true"
            , Bool -> Value
ValueBoolean Bool
False Value -> Parser Token () -> ParserT () [Token] [] Value
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"false"
            , Value
ValueNull Value -> Parser Token () -> ParserT () [Token] [] Value
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"null"
            , EnumValue -> Value
ValueEnum (EnumValue -> Value)
-> ParserT () [Token] [] EnumValue -> ParserT () [Token] [] Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] EnumValue
enumValue
            , [Value] -> Value
ValueList ([Value] -> Value)
-> ParserT () [Token] [] [Value] -> ParserT () [Token] [] Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] [Value]
listValue
            , [ObjectField] -> Value
ValueObject ([ObjectField] -> Value)
-> ParserT () [Token] [] [ObjectField]
-> ParserT () [Token] [] Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] [ObjectField]
objectValue
            ]

-- | https://spec.graphql.org/draft/#ListValue
listValue :: Parser Token [Value]
listValue :: ParserT () [Token] [] [Value]
listValue =  Char
-> Char
-> ParserT () [Token] [] [Value]
-> ParserT () [Token] [] [Value]
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'[' Char
']' (ParserT () [Token] [] [Value] -> ParserT () [Token] [] [Value])
-> ParserT () [Token] [] [Value] -> ParserT () [Token] [] [Value]
forall a b. (a -> b) -> a -> b
$ ParserT () [Token] [] Value -> ParserT () [Token] [] [Value]
forall a. ParserT () [Token] [] a -> ParserT () [Token] [] [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParserT () [Token] [] Value
value

-- | https://spec.graphql.org/draft/#ObjectValue
objectValue :: Parser Token [ObjectField]
objectValue :: ParserT () [Token] [] [ObjectField]
objectValue =
     Char
-> Char
-> ParserT () [Token] [] [ObjectField]
-> ParserT () [Token] [] [ObjectField]
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'{' Char
'}'
        (ParserT () [Token] [] [ObjectField]
 -> ParserT () [Token] [] [ObjectField])
-> (ParserT () [Token] [] [ObjectField]
    -> ParserT () [Token] [] [ObjectField])
-> ParserT () [Token] [] [ObjectField]
-> ParserT () [Token] [] [ObjectField]
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (ObjectField -> Name)
-> ParserT () [Token] [] [ObjectField]
-> ParserT () [Token] [] [ObjectField]
forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn ObjectField -> Name
objectFieldName
        (ParserT () [Token] [] [ObjectField]
 -> ParserT () [Token] [] [ObjectField])
-> ParserT () [Token] [] [ObjectField]
-> ParserT () [Token] [] [ObjectField]
forall a b. (a -> b) -> a -> b
$ ParserT () [Token] [] ObjectField
-> ParserT () [Token] [] [ObjectField]
forall a. ParserT () [Token] [] a -> ParserT () [Token] [] [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParserT () [Token] [] ObjectField
objectField

-- | A GraphQL 'EnumValue'
-- https://spec.graphql.org/draft/#EnumValue
enumValue :: Parser Token EnumValue
enumValue :: ParserT () [Token] [] EnumValue
enumValue =  Name -> EnumValue
EnumValue (Name -> EnumValue)
-> ParserT () [Token] [] Name -> ParserT () [Token] [] EnumValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [MisoString] -> ParserT () [Token] [] Name
nameButNot [MisoString
"true", MisoString
"false", MisoString
"null"]

-- | A GraphQL 'ObjectField'
-- https://spec.graphql.org/draft/#ObjectField
objectField :: Parser Token ObjectField
objectField :: ParserT () [Token] [] ObjectField
objectField =  Name -> Value -> ObjectField
ObjectField (Name -> Value -> ObjectField)
-> ParserT () [Token] [] Name
-> ParserT () [Token] [] (Value -> ObjectField)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Name
name ParserT () [Token] [] (Value -> ObjectField)
-> Parser Token () -> ParserT () [Token] [] (Value -> ObjectField)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Token ()
punctuator Char
':' ParserT () [Token] [] (Value -> ObjectField)
-> ParserT () [Token] [] Value -> ParserT () [Token] [] ObjectField
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Value
value

-- | GraphQL 'VariablesDefinition'
-- https://spec.graphql.org/draft/#VariablesDefinition
variablesDefinition :: Parser Token VariablesDefinition
variablesDefinition :: ParserT () [Token] [] VariablesDefinition
variablesDefinition =
     Char
-> Char
-> ParserT () [Token] [] VariablesDefinition
-> ParserT () [Token] [] VariablesDefinition
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'(' Char
')'
        (ParserT () [Token] [] VariablesDefinition
 -> ParserT () [Token] [] VariablesDefinition)
-> (ParserT () [Token] [] VariablesDefinition
    -> ParserT () [Token] [] VariablesDefinition)
-> ParserT () [Token] [] VariablesDefinition
-> ParserT () [Token] [] VariablesDefinition
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (VariableDefinition -> Name)
-> ParserT () [Token] [] VariablesDefinition
-> ParserT () [Token] [] VariablesDefinition
forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn VariableDefinition -> Name
variableDefinitionName
        (ParserT () [Token] [] VariablesDefinition
 -> ParserT () [Token] [] VariablesDefinition)
-> ParserT () [Token] [] VariablesDefinition
-> ParserT () [Token] [] VariablesDefinition
forall a b. (a -> b) -> a -> b
$ ParserT () [Token] [] VariableDefinition
-> ParserT () [Token] [] VariablesDefinition
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 ParserT () [Token] [] VariableDefinition
variableDefinition

-- | A GraphQL 'VariableDefinition'
-- https://spec.graphql.org/draft/#VariableDefinition
variableDefinition :: Parser Token VariableDefinition
variableDefinition :: ParserT () [Token] [] VariableDefinition
variableDefinition =
     Maybe Description
-> Variable
-> Type
-> Maybe DefaultValue
-> Maybe Directives
-> VariableDefinition
VariableDefinition
        (Maybe Description
 -> Variable
 -> Type
 -> Maybe DefaultValue
 -> Maybe Directives
 -> VariableDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Variable
      -> Type
      -> Maybe DefaultValue
      -> Maybe Directives
      -> VariableDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Variable
   -> Type
   -> Maybe DefaultValue
   -> Maybe Directives
   -> VariableDefinition)
-> ParserT () [Token] [] Variable
-> ParserT
     ()
     [Token]
     []
     (Type
      -> Maybe DefaultValue -> Maybe Directives -> VariableDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Variable
variable
        ParserT
  ()
  [Token]
  []
  (Type
   -> Maybe DefaultValue -> Maybe Directives -> VariableDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Type
      -> Maybe DefaultValue -> Maybe Directives -> VariableDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Token ()
punctuator Char
':'
        ParserT
  ()
  [Token]
  []
  (Type
   -> Maybe DefaultValue -> Maybe Directives -> VariableDefinition)
-> ParserT () [Token] [] Type
-> ParserT
     ()
     [Token]
     []
     (Maybe DefaultValue -> Maybe Directives -> VariableDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Type
type'
        ParserT
  ()
  [Token]
  []
  (Maybe DefaultValue -> Maybe Directives -> VariableDefinition)
-> ParserT () [Token] [] (Maybe DefaultValue)
-> ParserT () [Token] [] (Maybe Directives -> VariableDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] DefaultValue
-> ParserT () [Token] [] (Maybe DefaultValue)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] DefaultValue
defaultValue
        ParserT () [Token] [] (Maybe Directives -> VariableDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] VariableDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives

-- | A GraphQL 'Variable'
-- https://spec.graphql.org/draft/#Variable
variable :: Parser Token Variable
variable :: ParserT () [Token] [] Variable
variable =  Name -> Variable
Variable (Name -> Variable)
-> Parser Token () -> ParserT () [Token] [] (Name -> Variable)
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> Parser Token ()
punctuator Char
'$' ParserT () [Token] [] (Name -> Variable)
-> ParserT () [Token] [] Name -> ParserT () [Token] [] Variable
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name

-- | A GraphQL 'DefaultValue'
-- https://spec.graphql.org/draft/#DefaultValue
defaultValue :: Parser Token DefaultValue
defaultValue :: ParserT () [Token] [] DefaultValue
defaultValue =  Value -> DefaultValue
DefaultValue (Value -> DefaultValue)
-> Parser Token () -> ParserT () [Token] [] (Value -> DefaultValue)
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> Parser Token ()
punctuator Char
'=' ParserT () [Token] [] (Value -> DefaultValue)
-> ParserT () [Token] [] Value
-> ParserT () [Token] [] DefaultValue
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Value
value

-- | A GraphQL 'Type'
-- https://spec.graphql.org/draft/#Type
type' :: Parser Token Type
type' :: ParserT () [Token] [] Type
type' =
     [ParserT () [Token] [] Type] -> ParserT () [Token] [] Type
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ NonNullType -> Type
TypeNonNull (NonNullType -> Type)
-> ParserT () [Token] [] NonNullType -> ParserT () [Token] [] Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] NonNullType
nonNullType
            , ListType -> Type
TypeList (ListType -> Type)
-> ParserT () [Token] [] ListType -> ParserT () [Token] [] Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] ListType
listType
            , NamedType -> Type
TypeNamed (NamedType -> Type)
-> ParserT () [Token] [] NamedType -> ParserT () [Token] [] Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] NamedType
namedType
            ]

-- | A GraphQL 'NamedType'
-- https://spec.graphql.org/draft/#NamedType
namedType :: Parser Token NamedType
namedType :: ParserT () [Token] [] NamedType
namedType =  Name -> NamedType
NamedType (Name -> NamedType)
-> ParserT () [Token] [] Name -> ParserT () [Token] [] NamedType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Name
name

-- | A GraphQL 'ListType'
-- https://spec.graphql.org/draft/#ListType
listType :: Parser Token ListType
listType :: ParserT () [Token] [] ListType
listType =  Char
-> Char
-> ParserT () [Token] [] ListType
-> ParserT () [Token] [] ListType
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'[' Char
']' (ParserT () [Token] [] ListType -> ParserT () [Token] [] ListType)
-> ParserT () [Token] [] ListType -> ParserT () [Token] [] ListType
forall a b. (a -> b) -> a -> b
$ Type -> ListType
ListType (Type -> ListType)
-> ParserT () [Token] [] Type -> ParserT () [Token] [] ListType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Type
type'

-- | A GraphQL 'NonNullType'
-- https://spec.graphql.org/draft/#NonNullType
nonNullType :: Parser Token NonNullType
nonNullType :: ParserT () [Token] [] NonNullType
nonNullType =
     [ParserT () [Token] [] NonNullType]
-> ParserT () [Token] [] NonNullType
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ NamedType -> NonNullType
NonNullTypeNamed (NamedType -> NonNullType)
-> ParserT () [Token] [] NamedType
-> ParserT () [Token] [] NonNullType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] NamedType
namedType
            , ListType -> NonNullType
NonNullTypeList (ListType -> NonNullType)
-> ParserT () [Token] [] ListType
-> ParserT () [Token] [] NonNullType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] ListType
listType
            ]
        ParserT () [Token] [] NonNullType
-> Parser Token () -> ParserT () [Token] [] NonNullType
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Token ()
punctuator Char
'!'

-- | The GraphQL 'Directives' type
-- https://spec.graphql.org/draft/#Directives
directives :: Parser Token Directives
directives :: ParserT () [Token] [] Directives
directives =  ParserT () [Token] [] Directive -> ParserT () [Token] [] Directives
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 ParserT () [Token] [] Directive
directive

-- | A GraphQL 'Directive'
-- https://spec.graphql.org/draft/#Directive
directive :: Parser Token Directive
directive :: ParserT () [Token] [] Directive
directive =
     Name -> Maybe Arguments -> Directive
Directive
        (Name -> Maybe Arguments -> Directive)
-> Parser Token ()
-> ParserT () [Token] [] (Name -> Maybe Arguments -> Directive)
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> Parser Token ()
punctuator Char
'@'
        ParserT () [Token] [] (Name -> Maybe Arguments -> Directive)
-> ParserT () [Token] [] Name
-> ParserT () [Token] [] (Maybe Arguments -> Directive)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT () [Token] [] (Maybe Arguments -> Directive)
-> ParserT () [Token] [] (Maybe Arguments)
-> ParserT () [Token] [] Directive
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Arguments
-> ParserT () [Token] [] (Maybe Arguments)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Arguments
arguments

-- | A GraphQL 'TypeSystemDefinition'
-- https://spec.graphql.org/draft/#TypeSystemDefinition
typeSystemDefinition :: Parser Token TypeSystemDefinition
typeSystemDefinition :: ParserT () [Token] [] TypeSystemDefinition
typeSystemDefinition =
     [ParserT () [Token] [] TypeSystemDefinition]
-> ParserT () [Token] [] TypeSystemDefinition
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ SchemaDefinition -> TypeSystemDefinition
DefinitionSchema (SchemaDefinition -> TypeSystemDefinition)
-> ParserT () [Token] [] SchemaDefinition
-> ParserT () [Token] [] TypeSystemDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] SchemaDefinition
schemaDefinition
            , TypeDefinition -> TypeSystemDefinition
DefinitionType (TypeDefinition -> TypeSystemDefinition)
-> ParserT () [Token] [] TypeDefinition
-> ParserT () [Token] [] TypeSystemDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] TypeDefinition
typeDefinition
            , DirectiveDefinition -> TypeSystemDefinition
DefinitionDirective (DirectiveDefinition -> TypeSystemDefinition)
-> ParserT () [Token] [] DirectiveDefinition
-> ParserT () [Token] [] TypeSystemDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] DirectiveDefinition
directiveDefinition
            ]

-- | A GraphQL 'TypeSystemExtension'
-- https://spec.graphql.org/draft/#TypeSystemExtension
typeSystemExtension :: Parser Token TypeSystemExtension
typeSystemExtension :: ParserT () [Token] [] TypeSystemExtension
typeSystemExtension =
     [ParserT () [Token] [] TypeSystemExtension]
-> ParserT () [Token] [] TypeSystemExtension
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ SchemaExtension -> TypeSystemExtension
ExtensionSchema (SchemaExtension -> TypeSystemExtension)
-> ParserT () [Token] [] SchemaExtension
-> ParserT () [Token] [] TypeSystemExtension
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] SchemaExtension
schemaExtension
            , TypeExtension -> TypeSystemExtension
ExtensionType (TypeExtension -> TypeSystemExtension)
-> ParserT () [Token] [] TypeExtension
-> ParserT () [Token] [] TypeSystemExtension
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] TypeExtension
typeExtension
            ]

-- | A GraphQL 'SchemaDefinition'
-- https://spec.graphql.org/draft/#SchemaDefinition
schemaDefinition :: Parser Token SchemaDefinition
schemaDefinition :: ParserT () [Token] [] SchemaDefinition
schemaDefinition =
     Maybe Description
-> Maybe Directives
-> RootOperationTypeDefinitions
-> SchemaDefinition
SchemaDefinition
        (Maybe Description
 -> Maybe Directives
 -> RootOperationTypeDefinitions
 -> SchemaDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Maybe Directives
      -> RootOperationTypeDefinitions -> SchemaDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Maybe Directives
   -> RootOperationTypeDefinitions -> SchemaDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Maybe Directives
      -> RootOperationTypeDefinitions -> SchemaDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"schema"
        ParserT
  ()
  [Token]
  []
  (Maybe Directives
   -> RootOperationTypeDefinitions -> SchemaDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT
     () [Token] [] (RootOperationTypeDefinitions -> SchemaDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
        ParserT
  () [Token] [] (RootOperationTypeDefinitions -> SchemaDefinition)
-> ParserT () [Token] [] RootOperationTypeDefinitions
-> ParserT () [Token] [] SchemaDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] RootOperationTypeDefinitions
rootOperationTypeDefinitions

-- | A GraphQL 'SchemaExtension'
-- https://spec.graphql.org/draft/#SchemaExtension
schemaExtension :: Parser Token SchemaExtension
schemaExtension :: ParserT () [Token] [] SchemaExtension
schemaExtension =  do
    MisoString -> Parser Token ()
keyword MisoString
"extend"
    MisoString -> Parser Token ()
keyword MisoString
"schema"
    Maybe Directives
directives <- ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
    Maybe RootOperationTypeDefinitions
rootOperationTypeDefinitions <- ParserT () [Token] [] RootOperationTypeDefinitions
-> ParserT () [Token] [] (Maybe RootOperationTypeDefinitions)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] RootOperationTypeDefinitions
rootOperationTypeDefinitions
    let ok :: SchemaExtension
ok = Maybe Directives
-> Maybe RootOperationTypeDefinitions -> SchemaExtension
SchemaExtension Maybe Directives
directives Maybe RootOperationTypeDefinitions
rootOperationTypeDefinitions
    case (Maybe Directives
directives, Maybe RootOperationTypeDefinitions
rootOperationTypeDefinitions) of
        (Maybe Directives
Nothing, Maybe RootOperationTypeDefinitions
Nothing) -> ParserT () [Token] [] SchemaExtension
forall a. ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a
empty
        (Maybe Directives
_, Just{}) -> SchemaExtension -> ParserT () [Token] [] SchemaExtension
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure SchemaExtension
ok
        (Maybe Directives, Maybe RootOperationTypeDefinitions)
_ -> Char -> SchemaExtension -> ParserT () [Token] [] SchemaExtension
forall a. Char -> a -> Parser Token a
lookaheadCantBe' Char
'{' SchemaExtension
ok

-- | List of 'RootOperationTypeDefinition'
rootOperationTypeDefinitions :: Parser Token RootOperationTypeDefinitions
rootOperationTypeDefinitions :: ParserT () [Token] [] RootOperationTypeDefinitions
rootOperationTypeDefinitions =
     Char
-> Char
-> ParserT () [Token] [] RootOperationTypeDefinitions
-> ParserT () [Token] [] RootOperationTypeDefinitions
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'{' Char
'}'
        (ParserT () [Token] [] RootOperationTypeDefinitions
 -> ParserT () [Token] [] RootOperationTypeDefinitions)
-> (Parser Token RootOperationTypeDefinition
    -> ParserT () [Token] [] RootOperationTypeDefinitions)
-> Parser Token RootOperationTypeDefinition
-> ParserT () [Token] [] RootOperationTypeDefinitions
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (RootOperationTypeDefinition -> OperationType)
-> ParserT () [Token] [] RootOperationTypeDefinitions
-> ParserT () [Token] [] RootOperationTypeDefinitions
forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn RootOperationTypeDefinition -> OperationType
rootOperationType
        (ParserT () [Token] [] RootOperationTypeDefinitions
 -> ParserT () [Token] [] RootOperationTypeDefinitions)
-> (Parser Token RootOperationTypeDefinition
    -> ParserT () [Token] [] RootOperationTypeDefinitions)
-> Parser Token RootOperationTypeDefinition
-> ParserT () [Token] [] RootOperationTypeDefinitions
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Parser Token RootOperationTypeDefinition
-> ParserT () [Token] [] RootOperationTypeDefinitions
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1
        (Parser Token RootOperationTypeDefinition
 -> ParserT () [Token] [] RootOperationTypeDefinitions)
-> Parser Token RootOperationTypeDefinition
-> ParserT () [Token] [] RootOperationTypeDefinitions
forall a b. (a -> b) -> a -> b
$ Parser Token RootOperationTypeDefinition
rootOperationTypeDefinition

-- | https://spec.graphql.org/draft/#RootOperationTypeDefinition
rootOperationTypeDefinition :: Parser Token RootOperationTypeDefinition
rootOperationTypeDefinition :: Parser Token RootOperationTypeDefinition
rootOperationTypeDefinition =
     OperationType -> NamedType -> RootOperationTypeDefinition
RootOperationTypeDefinition
        (OperationType -> NamedType -> RootOperationTypeDefinition)
-> ParserT () [Token] [] OperationType
-> ParserT () [Token] [] (NamedType -> RootOperationTypeDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] OperationType
operationType
        ParserT () [Token] [] (NamedType -> RootOperationTypeDefinition)
-> Parser Token ()
-> ParserT () [Token] [] (NamedType -> RootOperationTypeDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Token ()
punctuator Char
':'
        ParserT () [Token] [] (NamedType -> RootOperationTypeDefinition)
-> ParserT () [Token] [] NamedType
-> Parser Token RootOperationTypeDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] NamedType
namedType

-- | A GraphQL 'Description'
-- https://spec.graphql.org/draft/#Description
description :: Parser Token Description
description :: ParserT () [Token] [] Description
description =  do
    TokenString StringValue
stringValue <- ParserT () [Token] [] Token
forall a. Parser a a
nextToken
    Description -> ParserT () [Token] [] Description
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Description -> ParserT () [Token] [] Description)
-> Description -> ParserT () [Token] [] Description
forall a b. (a -> b) -> a -> b
$ StringValue -> Description
Description StringValue
stringValue

-- | A GraphQL 'TypeDefinition'
-- https://spec.graphql.org/draft/#TypeDefinition
typeDefinition :: Parser Token TypeDefinition
typeDefinition :: ParserT () [Token] [] TypeDefinition
typeDefinition =
     [ParserT () [Token] [] TypeDefinition]
-> ParserT () [Token] [] TypeDefinition
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ ScalarTypeDefinition -> TypeDefinition
DefinitionScalarType (ScalarTypeDefinition -> TypeDefinition)
-> ParserT () [Token] [] ScalarTypeDefinition
-> ParserT () [Token] [] TypeDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] ScalarTypeDefinition
scalarTypeDefinition
            , ObjectTypeDefinition -> TypeDefinition
DefinitionObjectType (ObjectTypeDefinition -> TypeDefinition)
-> ParserT () [Token] [] ObjectTypeDefinition
-> ParserT () [Token] [] TypeDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] ObjectTypeDefinition
objectTypeDefinition
            , InterfaceTypeDefinition -> TypeDefinition
DefinitionInterfaceType (InterfaceTypeDefinition -> TypeDefinition)
-> ParserT () [Token] [] InterfaceTypeDefinition
-> ParserT () [Token] [] TypeDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] InterfaceTypeDefinition
interfaceTypeDefinition
            , UnionTypeDefinition -> TypeDefinition
DefinitionUnionType (UnionTypeDefinition -> TypeDefinition)
-> ParserT () [Token] [] UnionTypeDefinition
-> ParserT () [Token] [] TypeDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] UnionTypeDefinition
unionTypeDefinition
            , EnumTypeDefinition -> TypeDefinition
DefinitionEnumType (EnumTypeDefinition -> TypeDefinition)
-> ParserT () [Token] [] EnumTypeDefinition
-> ParserT () [Token] [] TypeDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] EnumTypeDefinition
enumTypeDefinition
            , InputObjectTypeDefinition -> TypeDefinition
DefinitionInputObjectType (InputObjectTypeDefinition -> TypeDefinition)
-> ParserT () [Token] [] InputObjectTypeDefinition
-> ParserT () [Token] [] TypeDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] InputObjectTypeDefinition
inputObjectTypeDefinition
            ]

-- | A GraphQL 'TypeExtension'
-- https://spec.graphql.org/draft/#TypeExtension
typeExtension :: Parser Token TypeExtension
typeExtension :: ParserT () [Token] [] TypeExtension
typeExtension =
     [ParserT () [Token] [] TypeExtension]
-> ParserT () [Token] [] TypeExtension
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ ScalarTypeExtension -> TypeExtension
ExtensionScalarType (ScalarTypeExtension -> TypeExtension)
-> ParserT () [Token] [] ScalarTypeExtension
-> ParserT () [Token] [] TypeExtension
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] ScalarTypeExtension
scalarTypeExtension
            , ObjectTypeExtension -> TypeExtension
ExtensionObjectType (ObjectTypeExtension -> TypeExtension)
-> ParserT () [Token] [] ObjectTypeExtension
-> ParserT () [Token] [] TypeExtension
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] ObjectTypeExtension
objectTypeExtension
            , InterfaceTypeExtension -> TypeExtension
ExtensionInterfaceType (InterfaceTypeExtension -> TypeExtension)
-> ParserT () [Token] [] InterfaceTypeExtension
-> ParserT () [Token] [] TypeExtension
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] InterfaceTypeExtension
interfaceTypeExtension
            , UnionTypeExtension -> TypeExtension
ExtensionUnionType (UnionTypeExtension -> TypeExtension)
-> ParserT () [Token] [] UnionTypeExtension
-> ParserT () [Token] [] TypeExtension
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] UnionTypeExtension
unionTypeExtension
            , EnumTypeExtension -> TypeExtension
ExtensionEnumType (EnumTypeExtension -> TypeExtension)
-> ParserT () [Token] [] EnumTypeExtension
-> ParserT () [Token] [] TypeExtension
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] EnumTypeExtension
enumTypeExtension
            , InputObjectTypeExtension -> TypeExtension
ExtensionInputObjectType (InputObjectTypeExtension -> TypeExtension)
-> ParserT () [Token] [] InputObjectTypeExtension
-> ParserT () [Token] [] TypeExtension
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] InputObjectTypeExtension
inputObjectTypeExtension
            ]

-- | A GraphQL 'ScalarTypeDefinition'
-- https://spec.graphql.org/draft/#ScalarTypeDefinition
scalarTypeDefinition :: Parser Token ScalarTypeDefinition
scalarTypeDefinition :: ParserT () [Token] [] ScalarTypeDefinition
scalarTypeDefinition =
     Maybe Description
-> Name -> Maybe Directives -> ScalarTypeDefinition
ScalarTypeDefinition
        (Maybe Description
 -> Name -> Maybe Directives -> ScalarTypeDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     () [Token] [] (Name -> Maybe Directives -> ScalarTypeDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  () [Token] [] (Name -> Maybe Directives -> ScalarTypeDefinition)
-> Parser Token ()
-> ParserT
     () [Token] [] (Name -> Maybe Directives -> ScalarTypeDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"scalar"
        ParserT
  () [Token] [] (Name -> Maybe Directives -> ScalarTypeDefinition)
-> ParserT () [Token] [] Name
-> ParserT () [Token] [] (Maybe Directives -> ScalarTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT () [Token] [] (Maybe Directives -> ScalarTypeDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] ScalarTypeDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives

-- | A GraphQL 'ScalarTypeExtension'
-- https://spec.graphql.org/draft/#ScalarTypeExtension
scalarTypeExtension :: Parser Token ScalarTypeExtension
scalarTypeExtension :: ParserT () [Token] [] ScalarTypeExtension
scalarTypeExtension =
     Name -> Directives -> ScalarTypeExtension
ScalarTypeExtension
        (Name -> Directives -> ScalarTypeExtension)
-> Parser Token ()
-> ParserT
     () [Token] [] (Name -> Directives -> ScalarTypeExtension)
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"extend"
        ParserT () [Token] [] (Name -> Directives -> ScalarTypeExtension)
-> Parser Token ()
-> ParserT
     () [Token] [] (Name -> Directives -> ScalarTypeExtension)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"scalar"
        ParserT () [Token] [] (Name -> Directives -> ScalarTypeExtension)
-> ParserT () [Token] [] Name
-> ParserT () [Token] [] (Directives -> ScalarTypeExtension)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT () [Token] [] (Directives -> ScalarTypeExtension)
-> ParserT () [Token] [] Directives
-> ParserT () [Token] [] ScalarTypeExtension
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
directives

-- | A GraphQL 'ObjectTypeDefinition'
-- https://spec.graphql.org/draft/#ObjectTypeDefinition
objectTypeDefinition :: Parser Token ObjectTypeDefinition
objectTypeDefinition :: ParserT () [Token] [] ObjectTypeDefinition
objectTypeDefinition =
     Maybe Description
-> Name
-> Maybe ImplementsInterfaces
-> Maybe Directives
-> Maybe FieldsDefinition
-> ObjectTypeDefinition
ObjectTypeDefinition
        (Maybe Description
 -> Name
 -> Maybe ImplementsInterfaces
 -> Maybe Directives
 -> Maybe FieldsDefinition
 -> ObjectTypeDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe ImplementsInterfaces
      -> Maybe Directives
      -> Maybe FieldsDefinition
      -> ObjectTypeDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe ImplementsInterfaces
   -> Maybe Directives
   -> Maybe FieldsDefinition
   -> ObjectTypeDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe ImplementsInterfaces
      -> Maybe Directives
      -> Maybe FieldsDefinition
      -> ObjectTypeDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"type"
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe ImplementsInterfaces
   -> Maybe Directives
   -> Maybe FieldsDefinition
   -> ObjectTypeDefinition)
-> ParserT () [Token] [] Name
-> ParserT
     ()
     [Token]
     []
     (Maybe ImplementsInterfaces
      -> Maybe Directives
      -> Maybe FieldsDefinition
      -> ObjectTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT
  ()
  [Token]
  []
  (Maybe ImplementsInterfaces
   -> Maybe Directives
   -> Maybe FieldsDefinition
   -> ObjectTypeDefinition)
-> ParserT () [Token] [] (Maybe ImplementsInterfaces)
-> ParserT
     ()
     [Token]
     []
     (Maybe Directives
      -> Maybe FieldsDefinition -> ObjectTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] ImplementsInterfaces
-> ParserT () [Token] [] (Maybe ImplementsInterfaces)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] ImplementsInterfaces
implementsInterfaces
        ParserT
  ()
  [Token]
  []
  (Maybe Directives
   -> Maybe FieldsDefinition -> ObjectTypeDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT
     () [Token] [] (Maybe FieldsDefinition -> ObjectTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
        ParserT
  () [Token] [] (Maybe FieldsDefinition -> ObjectTypeDefinition)
-> ParserT () [Token] [] (Maybe FieldsDefinition)
-> ParserT () [Token] [] ObjectTypeDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (FieldsDefinition -> Maybe FieldsDefinition
forall a. a -> Maybe a
Just (FieldsDefinition -> Maybe FieldsDefinition)
-> ParserT () [Token] [] FieldsDefinition
-> ParserT () [Token] [] (Maybe FieldsDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] FieldsDefinition
fieldsDefinition ParserT () [Token] [] (Maybe FieldsDefinition)
-> ParserT () [Token] [] (Maybe FieldsDefinition)
-> ParserT () [Token] [] (Maybe FieldsDefinition)
forall a.
ParserT () [Token] [] a
-> ParserT () [Token] [] a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char
-> Maybe FieldsDefinition
-> ParserT () [Token] [] (Maybe FieldsDefinition)
forall a. Char -> a -> Parser Token a
lookaheadCantBe' Char
'{' Maybe FieldsDefinition
forall a. Maybe a
Nothing)

-- | A GraphQL 'ObjectTypeExtension'
-- https://spec.graphql.org/draft/#ObjectTypeExtension
objectTypeExtension :: Parser Token ObjectTypeExtension
objectTypeExtension :: ParserT () [Token] [] ObjectTypeExtension
objectTypeExtension =  do
    MisoString -> Parser Token ()
keyword MisoString
"extend"
    MisoString -> Parser Token ()
keyword MisoString
"type"
    Name
name <- ParserT () [Token] [] Name
name
    Maybe ImplementsInterfaces
implementsInterfaces <- ParserT () [Token] [] ImplementsInterfaces
-> ParserT () [Token] [] (Maybe ImplementsInterfaces)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] ImplementsInterfaces
implementsInterfaces
    Maybe Directives
directives <- ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
    Maybe FieldsDefinition
fieldsDefinition <- ParserT () [Token] [] FieldsDefinition
-> ParserT () [Token] [] (Maybe FieldsDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] FieldsDefinition
fieldsDefinition
    let ok :: ObjectTypeExtension
ok = Name
-> Maybe ImplementsInterfaces
-> Maybe Directives
-> Maybe FieldsDefinition
-> ObjectTypeExtension
ObjectTypeExtension Name
name Maybe ImplementsInterfaces
implementsInterfaces Maybe Directives
directives Maybe FieldsDefinition
fieldsDefinition
    case (Maybe ImplementsInterfaces
implementsInterfaces, Maybe Directives
directives, Maybe FieldsDefinition
fieldsDefinition) of
        (Maybe ImplementsInterfaces
Nothing, Maybe Directives
Nothing, Maybe FieldsDefinition
Nothing) -> ParserT () [Token] [] ObjectTypeExtension
forall a. ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a
empty
        (Maybe ImplementsInterfaces
_, Maybe Directives
_, Just{}) -> ObjectTypeExtension -> ParserT () [Token] [] ObjectTypeExtension
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ObjectTypeExtension
ok
        (Maybe ImplementsInterfaces, Maybe Directives,
 Maybe FieldsDefinition)
_ -> Char
-> ObjectTypeExtension -> ParserT () [Token] [] ObjectTypeExtension
forall a. Char -> a -> Parser Token a
lookaheadCantBe' Char
'{' ObjectTypeExtension
ok

-- | A GraphQL 'ImplementsInterfaces'
-- https://spec.graphql.org/draft/#ImplementsInterfaces
implementsInterfaces :: Parser Token ImplementsInterfaces
implementsInterfaces :: ParserT () [Token] [] ImplementsInterfaces
implementsInterfaces =
     NonEmpty NamedType -> ImplementsInterfaces
ImplementsInterfaces
        (NonEmpty NamedType -> ImplementsInterfaces)
-> Parser Token ()
-> ParserT
     () [Token] [] (NonEmpty NamedType -> ImplementsInterfaces)
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"implements"
        ParserT () [Token] [] (NonEmpty NamedType -> ImplementsInterfaces)
-> ParserT () [Token] [] (Maybe ())
-> ParserT
     () [Token] [] (NonEmpty NamedType -> ImplementsInterfaces)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Token () -> ParserT () [Token] [] (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Char -> Parser Token ()
punctuator Char
'&')
        ParserT () [Token] [] (NonEmpty NamedType -> ImplementsInterfaces)
-> ParserT () [Token] [] (NonEmpty NamedType)
-> ParserT () [Token] [] ImplementsInterfaces
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char
-> ParserT () [Token] [] NamedType
-> ParserT () [Token] [] (NonEmpty NamedType)
forall a. Char -> Parser Token a -> Parser Token (NonEmpty a)
sepBy1' Char
'&' ParserT () [Token] [] NamedType
namedType

-- | A GraphQL 'FieldsDefinition'
-- https://spec.graphql.org/draft/#FieldsDefinitionn
fieldsDefinition :: Parser Token FieldsDefinition
fieldsDefinition :: ParserT () [Token] [] FieldsDefinition
fieldsDefinition =
     Char
-> Char
-> ParserT () [Token] [] FieldsDefinition
-> ParserT () [Token] [] FieldsDefinition
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'{' Char
'}'
        (ParserT () [Token] [] FieldsDefinition
 -> ParserT () [Token] [] FieldsDefinition)
-> ParserT () [Token] [] FieldsDefinition
-> ParserT () [Token] [] FieldsDefinition
forall a b. (a -> b) -> a -> b
$ NonEmpty FieldDefinition -> FieldsDefinition
FieldsDefinition
        (NonEmpty FieldDefinition -> FieldsDefinition)
-> ParserT () [Token] [] (NonEmpty FieldDefinition)
-> ParserT () [Token] [] FieldsDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (FieldDefinition -> Name)
-> ParserT () [Token] [] (NonEmpty FieldDefinition)
-> ParserT () [Token] [] (NonEmpty FieldDefinition)
forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn FieldDefinition -> Name
fieldDefinitionName (ParserT () [Token] [] FieldDefinition
-> ParserT () [Token] [] (NonEmpty FieldDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 ParserT () [Token] [] FieldDefinition
fieldDefinition)

-- | A GraphQL 'FieldDefinition'
-- https://spec.graphql.org/draft/#FieldDefinition
fieldDefinition :: Parser Token FieldDefinition
fieldDefinition :: ParserT () [Token] [] FieldDefinition
fieldDefinition =
     Maybe Description
-> Name
-> Maybe ArgumentsDefinition
-> Type
-> Maybe Directives
-> FieldDefinition
FieldDefinition
        (Maybe Description
 -> Name
 -> Maybe ArgumentsDefinition
 -> Type
 -> Maybe Directives
 -> FieldDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe ArgumentsDefinition
      -> Type
      -> Maybe Directives
      -> FieldDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe ArgumentsDefinition
   -> Type
   -> Maybe Directives
   -> FieldDefinition)
-> ParserT () [Token] [] Name
-> ParserT
     ()
     [Token]
     []
     (Maybe ArgumentsDefinition
      -> Type -> Maybe Directives -> FieldDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT
  ()
  [Token]
  []
  (Maybe ArgumentsDefinition
   -> Type -> Maybe Directives -> FieldDefinition)
-> ParserT () [Token] [] (Maybe ArgumentsDefinition)
-> ParserT
     () [Token] [] (Type -> Maybe Directives -> FieldDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] ArgumentsDefinition
-> ParserT () [Token] [] (Maybe ArgumentsDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] ArgumentsDefinition
argumentsDefinition
        ParserT () [Token] [] (Type -> Maybe Directives -> FieldDefinition)
-> Parser Token ()
-> ParserT
     () [Token] [] (Type -> Maybe Directives -> FieldDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Token ()
punctuator Char
':'
        ParserT () [Token] [] (Type -> Maybe Directives -> FieldDefinition)
-> ParserT () [Token] [] Type
-> ParserT () [Token] [] (Maybe Directives -> FieldDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Type
type'
        ParserT () [Token] [] (Maybe Directives -> FieldDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] FieldDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives

-- | https://spec.graphql.org/draft/#ArgumentsDefinition
argumentsDefinition :: Parser Token ArgumentsDefinition
argumentsDefinition :: ParserT () [Token] [] ArgumentsDefinition
argumentsDefinition =
     Char
-> Char
-> ParserT () [Token] [] ArgumentsDefinition
-> ParserT () [Token] [] ArgumentsDefinition
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'(' Char
')'
        (ParserT () [Token] [] ArgumentsDefinition
 -> ParserT () [Token] [] ArgumentsDefinition)
-> ParserT () [Token] [] ArgumentsDefinition
-> ParserT () [Token] [] ArgumentsDefinition
forall a b. (a -> b) -> a -> b
$ NonEmpty InputValueDefinition -> ArgumentsDefinition
ArgumentsDefinition
        (NonEmpty InputValueDefinition -> ArgumentsDefinition)
-> ParserT () [Token] [] (NonEmpty InputValueDefinition)
-> ParserT () [Token] [] ArgumentsDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (InputValueDefinition -> Name)
-> ParserT () [Token] [] (NonEmpty InputValueDefinition)
-> ParserT () [Token] [] (NonEmpty InputValueDefinition)
forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn InputValueDefinition -> Name
inputValueDefinitionName (ParserT () [Token] [] InputValueDefinition
-> ParserT () [Token] [] (NonEmpty InputValueDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 ParserT () [Token] [] InputValueDefinition
inputValueDefinition)

-- | https://spec.graphql.org/draft/#InputValueDefinition
inputValueDefinition :: Parser Token InputValueDefinition
inputValueDefinition :: ParserT () [Token] [] InputValueDefinition
inputValueDefinition =
     Maybe Description
-> Name
-> Type
-> Maybe DefaultValue
-> Maybe Directives
-> InputValueDefinition
InputValueDefinition
        (Maybe Description
 -> Name
 -> Type
 -> Maybe DefaultValue
 -> Maybe Directives
 -> InputValueDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Type
      -> Maybe DefaultValue
      -> Maybe Directives
      -> InputValueDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Name
   -> Type
   -> Maybe DefaultValue
   -> Maybe Directives
   -> InputValueDefinition)
-> ParserT () [Token] [] Name
-> ParserT
     ()
     [Token]
     []
     (Type
      -> Maybe DefaultValue -> Maybe Directives -> InputValueDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT
  ()
  [Token]
  []
  (Type
   -> Maybe DefaultValue -> Maybe Directives -> InputValueDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Type
      -> Maybe DefaultValue -> Maybe Directives -> InputValueDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Token ()
punctuator Char
':'
        ParserT
  ()
  [Token]
  []
  (Type
   -> Maybe DefaultValue -> Maybe Directives -> InputValueDefinition)
-> ParserT () [Token] [] Type
-> ParserT
     ()
     [Token]
     []
     (Maybe DefaultValue -> Maybe Directives -> InputValueDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Type
type'
        ParserT
  ()
  [Token]
  []
  (Maybe DefaultValue -> Maybe Directives -> InputValueDefinition)
-> ParserT () [Token] [] (Maybe DefaultValue)
-> ParserT () [Token] [] (Maybe Directives -> InputValueDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] DefaultValue
-> ParserT () [Token] [] (Maybe DefaultValue)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] DefaultValue
defaultValue
        ParserT () [Token] [] (Maybe Directives -> InputValueDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] InputValueDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives

-- | https://spec.graphql.org/draft/#InterfaceTypeDefinition
interfaceTypeDefinition :: Parser Token InterfaceTypeDefinition
interfaceTypeDefinition :: ParserT () [Token] [] InterfaceTypeDefinition
interfaceTypeDefinition =
     Maybe Description
-> Name
-> Maybe ImplementsInterfaces
-> Maybe Directives
-> Maybe FieldsDefinition
-> InterfaceTypeDefinition
InterfaceTypeDefinition
        (Maybe Description
 -> Name
 -> Maybe ImplementsInterfaces
 -> Maybe Directives
 -> Maybe FieldsDefinition
 -> InterfaceTypeDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe ImplementsInterfaces
      -> Maybe Directives
      -> Maybe FieldsDefinition
      -> InterfaceTypeDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe ImplementsInterfaces
   -> Maybe Directives
   -> Maybe FieldsDefinition
   -> InterfaceTypeDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe ImplementsInterfaces
      -> Maybe Directives
      -> Maybe FieldsDefinition
      -> InterfaceTypeDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"interface"
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe ImplementsInterfaces
   -> Maybe Directives
   -> Maybe FieldsDefinition
   -> InterfaceTypeDefinition)
-> ParserT () [Token] [] Name
-> ParserT
     ()
     [Token]
     []
     (Maybe ImplementsInterfaces
      -> Maybe Directives
      -> Maybe FieldsDefinition
      -> InterfaceTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT
  ()
  [Token]
  []
  (Maybe ImplementsInterfaces
   -> Maybe Directives
   -> Maybe FieldsDefinition
   -> InterfaceTypeDefinition)
-> ParserT () [Token] [] (Maybe ImplementsInterfaces)
-> ParserT
     ()
     [Token]
     []
     (Maybe Directives
      -> Maybe FieldsDefinition -> InterfaceTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] ImplementsInterfaces
-> ParserT () [Token] [] (Maybe ImplementsInterfaces)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] ImplementsInterfaces
implementsInterfaces
        ParserT
  ()
  [Token]
  []
  (Maybe Directives
   -> Maybe FieldsDefinition -> InterfaceTypeDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT
     () [Token] [] (Maybe FieldsDefinition -> InterfaceTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
        ParserT
  () [Token] [] (Maybe FieldsDefinition -> InterfaceTypeDefinition)
-> ParserT () [Token] [] (Maybe FieldsDefinition)
-> ParserT () [Token] [] InterfaceTypeDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (FieldsDefinition -> Maybe FieldsDefinition
forall a. a -> Maybe a
Just (FieldsDefinition -> Maybe FieldsDefinition)
-> ParserT () [Token] [] FieldsDefinition
-> ParserT () [Token] [] (Maybe FieldsDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] FieldsDefinition
fieldsDefinition ParserT () [Token] [] (Maybe FieldsDefinition)
-> ParserT () [Token] [] (Maybe FieldsDefinition)
-> ParserT () [Token] [] (Maybe FieldsDefinition)
forall a.
ParserT () [Token] [] a
-> ParserT () [Token] [] a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char
-> Maybe FieldsDefinition
-> ParserT () [Token] [] (Maybe FieldsDefinition)
forall a. Char -> a -> Parser Token a
lookaheadCantBe' Char
'{' Maybe FieldsDefinition
forall a. Maybe a
Nothing)

-- | https://spec.graphql.org/draft/#InterfaceTypeExtension
interfaceTypeExtension :: Parser Token InterfaceTypeExtension
interfaceTypeExtension :: ParserT () [Token] [] InterfaceTypeExtension
interfaceTypeExtension =  do
    MisoString -> Parser Token ()
keyword MisoString
"extend"
    MisoString -> Parser Token ()
keyword MisoString
"interface"
    Name
name <- ParserT () [Token] [] Name
name
    Maybe ImplementsInterfaces
implementsInterfaces <- ParserT () [Token] [] ImplementsInterfaces
-> ParserT () [Token] [] (Maybe ImplementsInterfaces)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] ImplementsInterfaces
implementsInterfaces
    Maybe Directives
directives <- ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
    Maybe FieldsDefinition
fieldsDefinition <- ParserT () [Token] [] FieldsDefinition
-> ParserT () [Token] [] (Maybe FieldsDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] FieldsDefinition
fieldsDefinition
    let ok :: InterfaceTypeExtension
ok = Name
-> Maybe ImplementsInterfaces
-> Maybe Directives
-> Maybe FieldsDefinition
-> InterfaceTypeExtension
InterfaceTypeExtension Name
name Maybe ImplementsInterfaces
implementsInterfaces Maybe Directives
directives Maybe FieldsDefinition
fieldsDefinition
    case (Maybe ImplementsInterfaces
implementsInterfaces, Maybe Directives
directives, Maybe FieldsDefinition
fieldsDefinition) of
        (Maybe ImplementsInterfaces
Nothing, Maybe Directives
Nothing, Maybe FieldsDefinition
Nothing) -> ParserT () [Token] [] InterfaceTypeExtension
forall a. ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a
empty
        (Maybe ImplementsInterfaces
_, Maybe Directives
_, Just{}) -> InterfaceTypeExtension
-> ParserT () [Token] [] InterfaceTypeExtension
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure InterfaceTypeExtension
ok
        (Maybe ImplementsInterfaces, Maybe Directives,
 Maybe FieldsDefinition)
_ -> Char
-> InterfaceTypeExtension
-> ParserT () [Token] [] InterfaceTypeExtension
forall a. Char -> a -> Parser Token a
lookaheadCantBe' Char
'{' InterfaceTypeExtension
ok

-- | https://spec.graphql.org/draft/#UnionTypeDefinition
unionTypeDefinition :: Parser Token UnionTypeDefinition
unionTypeDefinition :: ParserT () [Token] [] UnionTypeDefinition
unionTypeDefinition =
     Maybe Description
-> Name
-> Maybe Directives
-> Maybe UnionMemberTypes
-> UnionTypeDefinition
UnionTypeDefinition
        (Maybe Description
 -> Name
 -> Maybe Directives
 -> Maybe UnionMemberTypes
 -> UnionTypeDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe Directives
      -> Maybe UnionMemberTypes
      -> UnionTypeDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe Directives
   -> Maybe UnionMemberTypes
   -> UnionTypeDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe Directives
      -> Maybe UnionMemberTypes
      -> UnionTypeDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"union"
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe Directives
   -> Maybe UnionMemberTypes
   -> UnionTypeDefinition)
-> ParserT () [Token] [] Name
-> ParserT
     ()
     [Token]
     []
     (Maybe Directives -> Maybe UnionMemberTypes -> UnionTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT
  ()
  [Token]
  []
  (Maybe Directives -> Maybe UnionMemberTypes -> UnionTypeDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT
     () [Token] [] (Maybe UnionMemberTypes -> UnionTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
        ParserT
  () [Token] [] (Maybe UnionMemberTypes -> UnionTypeDefinition)
-> ParserT () [Token] [] (Maybe UnionMemberTypes)
-> ParserT () [Token] [] UnionTypeDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] UnionMemberTypes
-> ParserT () [Token] [] (Maybe UnionMemberTypes)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] UnionMemberTypes
unionMemberTypes

-- | https://spec.graphql.org/draft/#UnionMemberTypes
unionMemberTypes :: Parser Token UnionMemberTypes
unionMemberTypes :: ParserT () [Token] [] UnionMemberTypes
unionMemberTypes =
     NonEmpty NamedType -> UnionMemberTypes
UnionMemberTypes
        (NonEmpty NamedType -> UnionMemberTypes)
-> ParserT () [Token] [] (Maybe ())
-> ParserT () [Token] [] (NonEmpty NamedType -> UnionMemberTypes)
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Parser Token () -> ParserT () [Token] [] (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Char -> Parser Token ()
punctuator Char
'|')
        ParserT () [Token] [] (NonEmpty NamedType -> UnionMemberTypes)
-> ParserT () [Token] [] (NonEmpty NamedType)
-> ParserT () [Token] [] UnionMemberTypes
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (NamedType -> NamedType)
-> ParserT () [Token] [] (NonEmpty NamedType)
-> ParserT () [Token] [] (NonEmpty NamedType)
forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn NamedType -> NamedType
forall a. a -> a
id (Char
-> ParserT () [Token] [] NamedType
-> ParserT () [Token] [] (NonEmpty NamedType)
forall a. Char -> Parser Token a -> Parser Token (NonEmpty a)
sepBy1' Char
'|' ParserT () [Token] [] NamedType
namedType)

-- | https://spec.graphql.org/draft/#UnionTypeExtension
unionTypeExtension :: Parser Token UnionTypeExtension
unionTypeExtension :: ParserT () [Token] [] UnionTypeExtension
unionTypeExtension =  do
    MisoString -> Parser Token ()
keyword MisoString
"extend"
    MisoString -> Parser Token ()
keyword MisoString
"union"
    Name
name <- ParserT () [Token] [] Name
name
    Maybe Directives
directives <- ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
    Maybe UnionMemberTypes
unionMemberTypes <- ParserT () [Token] [] UnionMemberTypes
-> ParserT () [Token] [] (Maybe UnionMemberTypes)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] UnionMemberTypes
unionMemberTypes
    case (Maybe Directives
directives, Maybe UnionMemberTypes
unionMemberTypes) of
        (Maybe Directives
Nothing, Maybe UnionMemberTypes
Nothing) -> ParserT () [Token] [] UnionTypeExtension
forall a. ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a
empty
        (Maybe Directives, Maybe UnionMemberTypes)
_ -> UnionTypeExtension -> ParserT () [Token] [] UnionTypeExtension
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (UnionTypeExtension -> ParserT () [Token] [] UnionTypeExtension)
-> UnionTypeExtension -> ParserT () [Token] [] UnionTypeExtension
forall a b. (a -> b) -> a -> b
$ Name
-> Maybe Directives -> Maybe UnionMemberTypes -> UnionTypeExtension
UnionTypeExtension Name
name Maybe Directives
directives Maybe UnionMemberTypes
unionMemberTypes

-- | https://spec.graphql.org/draft/#EnumTypeDefinition
enumTypeDefinition :: Parser Token EnumTypeDefinition
enumTypeDefinition :: ParserT () [Token] [] EnumTypeDefinition
enumTypeDefinition =
     Maybe Description
-> Name
-> Maybe Directives
-> Maybe EnumValuesDefinition
-> EnumTypeDefinition
EnumTypeDefinition
        (Maybe Description
 -> Name
 -> Maybe Directives
 -> Maybe EnumValuesDefinition
 -> EnumTypeDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe Directives
      -> Maybe EnumValuesDefinition
      -> EnumTypeDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe Directives
   -> Maybe EnumValuesDefinition
   -> EnumTypeDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe Directives
      -> Maybe EnumValuesDefinition
      -> EnumTypeDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"enum"
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe Directives
   -> Maybe EnumValuesDefinition
   -> EnumTypeDefinition)
-> ParserT () [Token] [] Name
-> ParserT
     ()
     [Token]
     []
     (Maybe Directives
      -> Maybe EnumValuesDefinition -> EnumTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT
  ()
  [Token]
  []
  (Maybe Directives
   -> Maybe EnumValuesDefinition -> EnumTypeDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT
     () [Token] [] (Maybe EnumValuesDefinition -> EnumTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
        ParserT
  () [Token] [] (Maybe EnumValuesDefinition -> EnumTypeDefinition)
-> ParserT () [Token] [] (Maybe EnumValuesDefinition)
-> ParserT () [Token] [] EnumTypeDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (EnumValuesDefinition -> Maybe EnumValuesDefinition
forall a. a -> Maybe a
Just (EnumValuesDefinition -> Maybe EnumValuesDefinition)
-> ParserT () [Token] [] EnumValuesDefinition
-> ParserT () [Token] [] (Maybe EnumValuesDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] EnumValuesDefinition
enumValuesDefinition ParserT () [Token] [] (Maybe EnumValuesDefinition)
-> ParserT () [Token] [] (Maybe EnumValuesDefinition)
-> ParserT () [Token] [] (Maybe EnumValuesDefinition)
forall a.
ParserT () [Token] [] a
-> ParserT () [Token] [] a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char
-> Maybe EnumValuesDefinition
-> ParserT () [Token] [] (Maybe EnumValuesDefinition)
forall a. Char -> a -> Parser Token a
lookaheadCantBe' Char
'{' Maybe EnumValuesDefinition
forall a. Maybe a
Nothing)

-- | https://spec.graphql.org/draft/#EnumValuesDefinition
enumValuesDefinition :: Parser Token EnumValuesDefinition
enumValuesDefinition :: ParserT () [Token] [] EnumValuesDefinition
enumValuesDefinition =
     Char
-> Char
-> ParserT () [Token] [] EnumValuesDefinition
-> ParserT () [Token] [] EnumValuesDefinition
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'{' Char
'}'
        (ParserT () [Token] [] EnumValuesDefinition
 -> ParserT () [Token] [] EnumValuesDefinition)
-> ParserT () [Token] [] EnumValuesDefinition
-> ParserT () [Token] [] EnumValuesDefinition
forall a b. (a -> b) -> a -> b
$ NonEmpty EnumValueDefinition -> EnumValuesDefinition
EnumValuesDefinition
        (NonEmpty EnumValueDefinition -> EnumValuesDefinition)
-> ParserT () [Token] [] (NonEmpty EnumValueDefinition)
-> ParserT () [Token] [] EnumValuesDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (EnumValueDefinition -> Name)
-> ParserT () [Token] [] (NonEmpty EnumValueDefinition)
-> ParserT () [Token] [] (NonEmpty EnumValueDefinition)
forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn EnumValueDefinition -> Name
enumValueDefinitionName (ParserT () [Token] [] EnumValueDefinition
-> ParserT () [Token] [] (NonEmpty EnumValueDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 ParserT () [Token] [] EnumValueDefinition
enumValueDefinition)

-- | https://spec.graphql.org/draft/#EnumValueDefinition
enumValueDefinition :: Parser Token EnumValueDefinition
enumValueDefinition :: ParserT () [Token] [] EnumValueDefinition
enumValueDefinition =
     Maybe Description
-> EnumValue -> Maybe Directives -> EnumValueDefinition
EnumValueDefinition
        (Maybe Description
 -> EnumValue -> Maybe Directives -> EnumValueDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (EnumValue -> Maybe Directives -> EnumValueDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (EnumValue -> Maybe Directives -> EnumValueDefinition)
-> ParserT () [Token] [] EnumValue
-> ParserT () [Token] [] (Maybe Directives -> EnumValueDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] EnumValue
enumValue
        ParserT () [Token] [] (Maybe Directives -> EnumValueDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT () [Token] [] EnumValueDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives

-- | https://spec.graphql.org/draft/#EnumTypeExtension
enumTypeExtension :: Parser Token EnumTypeExtension
enumTypeExtension :: ParserT () [Token] [] EnumTypeExtension
enumTypeExtension =  do
    MisoString -> Parser Token ()
keyword MisoString
"extend"
    MisoString -> Parser Token ()
keyword MisoString
"enum"
    Name
name <- ParserT () [Token] [] Name
name
    Maybe Directives
directives <- ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
    Maybe EnumValuesDefinition
enumValuesDefinition <- ParserT () [Token] [] EnumValuesDefinition
-> ParserT () [Token] [] (Maybe EnumValuesDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] EnumValuesDefinition
enumValuesDefinition
    let ok :: EnumTypeExtension
ok = Name
-> Maybe Directives
-> Maybe EnumValuesDefinition
-> EnumTypeExtension
EnumTypeExtension Name
name Maybe Directives
directives Maybe EnumValuesDefinition
enumValuesDefinition
    case (Maybe Directives
directives, Maybe EnumValuesDefinition
enumValuesDefinition) of
        (Maybe Directives
Nothing, Maybe EnumValuesDefinition
Nothing) -> ParserT () [Token] [] EnumTypeExtension
forall a. ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a
empty
        (Maybe Directives
_, Just{}) -> EnumTypeExtension -> ParserT () [Token] [] EnumTypeExtension
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure EnumTypeExtension
ok
        (Maybe Directives, Maybe EnumValuesDefinition)
_ -> Char
-> EnumTypeExtension -> ParserT () [Token] [] EnumTypeExtension
forall a. Char -> a -> Parser Token a
lookaheadCantBe' Char
'{' EnumTypeExtension
ok

-- | InputObjectTypeDefinition
-- https://spec.graphql.org/draft/#InputObjectTypeDefinition
inputObjectTypeDefinition :: Parser Token InputObjectTypeDefinition
inputObjectTypeDefinition :: ParserT () [Token] [] InputObjectTypeDefinition
inputObjectTypeDefinition =
     Maybe Description
-> Name
-> Maybe Directives
-> Maybe InputFieldsDefinition
-> InputObjectTypeDefinition
InputObjectTypeDefinition
        (Maybe Description
 -> Name
 -> Maybe Directives
 -> Maybe InputFieldsDefinition
 -> InputObjectTypeDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe Directives
      -> Maybe InputFieldsDefinition
      -> InputObjectTypeDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe Directives
   -> Maybe InputFieldsDefinition
   -> InputObjectTypeDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe Directives
      -> Maybe InputFieldsDefinition
      -> InputObjectTypeDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"input"
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe Directives
   -> Maybe InputFieldsDefinition
   -> InputObjectTypeDefinition)
-> ParserT () [Token] [] Name
-> ParserT
     ()
     [Token]
     []
     (Maybe Directives
      -> Maybe InputFieldsDefinition -> InputObjectTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT
  ()
  [Token]
  []
  (Maybe Directives
   -> Maybe InputFieldsDefinition -> InputObjectTypeDefinition)
-> ParserT () [Token] [] (Maybe Directives)
-> ParserT
     ()
     [Token]
     []
     (Maybe InputFieldsDefinition -> InputObjectTypeDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
        ParserT
  ()
  [Token]
  []
  (Maybe InputFieldsDefinition -> InputObjectTypeDefinition)
-> ParserT () [Token] [] (Maybe InputFieldsDefinition)
-> ParserT () [Token] [] InputObjectTypeDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (InputFieldsDefinition -> Maybe InputFieldsDefinition
forall a. a -> Maybe a
Just (InputFieldsDefinition -> Maybe InputFieldsDefinition)
-> ParserT () [Token] [] InputFieldsDefinition
-> ParserT () [Token] [] (Maybe InputFieldsDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] InputFieldsDefinition
inputFieldsDefinition ParserT () [Token] [] (Maybe InputFieldsDefinition)
-> ParserT () [Token] [] (Maybe InputFieldsDefinition)
-> ParserT () [Token] [] (Maybe InputFieldsDefinition)
forall a.
ParserT () [Token] [] a
-> ParserT () [Token] [] a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char
-> Maybe InputFieldsDefinition
-> ParserT () [Token] [] (Maybe InputFieldsDefinition)
forall a. Char -> a -> Parser Token a
lookaheadCantBe' Char
'{' Maybe InputFieldsDefinition
forall a. Maybe a
Nothing)

-- | InputFieldsDefinition
-- https://spec.graphql.org/draft/#InputFieldsDefinition
inputFieldsDefinition :: Parser Token InputFieldsDefinition
inputFieldsDefinition :: ParserT () [Token] [] InputFieldsDefinition
inputFieldsDefinition =
     Char
-> Char
-> ParserT () [Token] [] InputFieldsDefinition
-> ParserT () [Token] [] InputFieldsDefinition
forall a. Char -> Char -> Parser Token a -> Parser Token a
enclosed' Char
'{' Char
'}'
        (ParserT () [Token] [] InputFieldsDefinition
 -> ParserT () [Token] [] InputFieldsDefinition)
-> ParserT () [Token] [] InputFieldsDefinition
-> ParserT () [Token] [] InputFieldsDefinition
forall a b. (a -> b) -> a -> b
$ NonEmpty InputValueDefinition -> InputFieldsDefinition
InputFieldsDefinition
        (NonEmpty InputValueDefinition -> InputFieldsDefinition)
-> ParserT () [Token] [] (NonEmpty InputValueDefinition)
-> ParserT () [Token] [] InputFieldsDefinition
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (InputValueDefinition -> Name)
-> ParserT () [Token] [] (NonEmpty InputValueDefinition)
-> ParserT () [Token] [] (NonEmpty InputValueDefinition)
forall (f :: * -> *) b a.
(Foldable f, Ord b) =>
(a -> b) -> Parser Token (f a) -> Parser Token (f a)
uniqueOn InputValueDefinition -> Name
inputValueDefinitionName (ParserT () [Token] [] InputValueDefinition
-> ParserT () [Token] [] (NonEmpty InputValueDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 ParserT () [Token] [] InputValueDefinition
inputValueDefinition)

-- | InputObjectTypeExtension
-- https://spec.graphql.org/draft/#InputObjectTypeExtension
inputObjectTypeExtension :: Parser Token InputObjectTypeExtension
inputObjectTypeExtension :: ParserT () [Token] [] InputObjectTypeExtension
inputObjectTypeExtension =  do
    MisoString -> Parser Token ()
keyword MisoString
"extend"
    MisoString -> Parser Token ()
keyword MisoString
"input"
    Name
name <- ParserT () [Token] [] Name
name
    Maybe Directives
directives <- ParserT () [Token] [] Directives
-> ParserT () [Token] [] (Maybe Directives)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Directives
directives
    Maybe InputFieldsDefinition
inputFieldsDefinition <- ParserT () [Token] [] InputFieldsDefinition
-> ParserT () [Token] [] (Maybe InputFieldsDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] InputFieldsDefinition
inputFieldsDefinition
    let ok :: InputObjectTypeExtension
ok = Name
-> Maybe Directives
-> Maybe InputFieldsDefinition
-> InputObjectTypeExtension
InputObjectTypeExtension Name
name Maybe Directives
directives Maybe InputFieldsDefinition
inputFieldsDefinition
    case (Maybe Directives
directives, Maybe InputFieldsDefinition
inputFieldsDefinition) of
        (Maybe Directives
Nothing, Maybe InputFieldsDefinition
Nothing) -> ParserT () [Token] [] InputObjectTypeExtension
forall a. ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a
empty
        (Maybe Directives
_, Just{}) -> InputObjectTypeExtension
-> ParserT () [Token] [] InputObjectTypeExtension
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure InputObjectTypeExtension
ok
        (Maybe Directives, Maybe InputFieldsDefinition)
_ -> Char
-> InputObjectTypeExtension
-> ParserT () [Token] [] InputObjectTypeExtension
forall a. Char -> a -> Parser Token a
lookaheadCantBe' Char
'{' InputObjectTypeExtension
ok

-- | Directive definition
-- https://spec.graphql.org/draft/#DirectiveDefinition
directiveDefinition :: Parser Token DirectiveDefinition
directiveDefinition :: ParserT () [Token] [] DirectiveDefinition
directiveDefinition =
     Maybe Description
-> Name
-> Maybe ArgumentsDefinition
-> Bool
-> DirectiveLocations
-> DirectiveDefinition
DirectiveDefinition
        (Maybe Description
 -> Name
 -> Maybe ArgumentsDefinition
 -> Bool
 -> DirectiveLocations
 -> DirectiveDefinition)
-> ParserT () [Token] [] (Maybe Description)
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe ArgumentsDefinition
      -> Bool
      -> DirectiveLocations
      -> DirectiveDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] Description
-> ParserT () [Token] [] (Maybe Description)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] Description
description
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe ArgumentsDefinition
   -> Bool
   -> DirectiveLocations
   -> DirectiveDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe ArgumentsDefinition
      -> Bool
      -> DirectiveLocations
      -> DirectiveDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"directive"
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe ArgumentsDefinition
   -> Bool
   -> DirectiveLocations
   -> DirectiveDefinition)
-> Parser Token ()
-> ParserT
     ()
     [Token]
     []
     (Name
      -> Maybe ArgumentsDefinition
      -> Bool
      -> DirectiveLocations
      -> DirectiveDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Token ()
punctuator Char
'@'
        ParserT
  ()
  [Token]
  []
  (Name
   -> Maybe ArgumentsDefinition
   -> Bool
   -> DirectiveLocations
   -> DirectiveDefinition)
-> ParserT () [Token] [] Name
-> ParserT
     ()
     [Token]
     []
     (Maybe ArgumentsDefinition
      -> Bool -> DirectiveLocations -> DirectiveDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] Name
name
        ParserT
  ()
  [Token]
  []
  (Maybe ArgumentsDefinition
   -> Bool -> DirectiveLocations -> DirectiveDefinition)
-> ParserT () [Token] [] (Maybe ArgumentsDefinition)
-> ParserT
     () [Token] [] (Bool -> DirectiveLocations -> DirectiveDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] ArgumentsDefinition
-> ParserT () [Token] [] (Maybe ArgumentsDefinition)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ParserT () [Token] [] ArgumentsDefinition
argumentsDefinition
        ParserT
  () [Token] [] (Bool -> DirectiveLocations -> DirectiveDefinition)
-> ParserT () [Token] [] Bool
-> ParserT
     () [Token] [] (DirectiveLocations -> DirectiveDefinition)
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Bool
True Bool -> Parser Token () -> ParserT () [Token] [] Bool
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"repeatable" ParserT () [Token] [] Bool
-> ParserT () [Token] [] Bool -> ParserT () [Token] [] Bool
forall a.
ParserT () [Token] [] a
-> ParserT () [Token] [] a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool -> ParserT () [Token] [] Bool
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False)
        ParserT () [Token] [] (DirectiveLocations -> DirectiveDefinition)
-> Parser Token ()
-> ParserT
     () [Token] [] (DirectiveLocations -> DirectiveDefinition)
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* MisoString -> Parser Token ()
keyword MisoString
"on"
        ParserT () [Token] [] (DirectiveLocations -> DirectiveDefinition)
-> ParserT () [Token] [] DirectiveLocations
-> ParserT () [Token] [] DirectiveDefinition
forall a b.
ParserT () [Token] [] (a -> b)
-> ParserT () [Token] [] a -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParserT () [Token] [] DirectiveLocations
directiveLocations

-- | https://spec.graphql.org/draft/#DirectiveLocations
directiveLocations :: Parser Token DirectiveLocations
directiveLocations :: ParserT () [Token] [] DirectiveLocations
directiveLocations =
     Parser Token () -> ParserT () [Token] [] (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Char -> Parser Token ()
punctuator Char
'|')
        ParserT () [Token] [] (Maybe ())
-> ParserT () [Token] [] DirectiveLocations
-> ParserT () [Token] [] DirectiveLocations
forall a b.
ParserT () [Token] [] a
-> ParserT () [Token] [] b -> ParserT () [Token] [] b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char
-> Parser Token DirectiveLocation
-> ParserT () [Token] [] DirectiveLocations
forall a. Char -> Parser Token a -> Parser Token (NonEmpty a)
sepBy1' Char
'|' Parser Token DirectiveLocation
directiveLocation

-- | https://spec.graphql.org/draft/#DirectiveLocation
directiveLocation :: Parser Token DirectiveLocation
directiveLocation :: Parser Token DirectiveLocation
directiveLocation =
     [Parser Token DirectiveLocation] -> Parser Token DirectiveLocation
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ ExecutableDirectiveLocation -> DirectiveLocation
LocationExecutableDirective (ExecutableDirectiveLocation -> DirectiveLocation)
-> ParserT () [Token] [] ExecutableDirectiveLocation
-> Parser Token DirectiveLocation
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] ExecutableDirectiveLocation
executableDirectiveLocation
            , TypeSystemDirectiveLocation -> DirectiveLocation
LocationTypeSystemDirective (TypeSystemDirectiveLocation -> DirectiveLocation)
-> ParserT () [Token] [] TypeSystemDirectiveLocation
-> Parser Token DirectiveLocation
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserT () [Token] [] TypeSystemDirectiveLocation
typeSystemDirectiveLocation
            ]

-- | https://spec.graphql.org/draft/#ExecutableDirectiveLocation
executableDirectiveLocation :: Parser Token ExecutableDirectiveLocation
executableDirectiveLocation :: ParserT () [Token] [] ExecutableDirectiveLocation
executableDirectiveLocation =
     [ParserT () [Token] [] ExecutableDirectiveLocation]
-> ParserT () [Token] [] ExecutableDirectiveLocation
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ ExecutableDirectiveLocation
QUERY ExecutableDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] ExecutableDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"QUERY"
            , ExecutableDirectiveLocation
MUTATION ExecutableDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] ExecutableDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"MUTATION"
            , ExecutableDirectiveLocation
SUBSCRIPTION ExecutableDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] ExecutableDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"SUBSCRIPTION"
            , ExecutableDirectiveLocation
FIELD ExecutableDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] ExecutableDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"FIELD"
            , ExecutableDirectiveLocation
FRAGMENT_DEFINITION ExecutableDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] ExecutableDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"FRAGMENT_DEFINITION"
            , ExecutableDirectiveLocation
FRAGMENT_SPREAD ExecutableDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] ExecutableDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"FRAGMENT_SPREAD"
            , ExecutableDirectiveLocation
INLINE_FRAGMENT ExecutableDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] ExecutableDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"INLINE_FRAGMENT"
            , ExecutableDirectiveLocation
VARIABLE_DEFINITION ExecutableDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] ExecutableDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"VARIABLE_DEFINITION"
            ]

-- | https://spec.graphql.org/draft/#TypeSystemDirectiveLocation
typeSystemDirectiveLocation :: Parser Token TypeSystemDirectiveLocation
typeSystemDirectiveLocation :: ParserT () [Token] [] TypeSystemDirectiveLocation
typeSystemDirectiveLocation =
     [ParserT () [Token] [] TypeSystemDirectiveLocation]
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall (f :: * -> *) a. Alternative f => [f a] -> f a
oneOf
            [ TypeSystemDirectiveLocation
SCHEMA TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"SCHEMA"
            , TypeSystemDirectiveLocation
SCALAR TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"SCALAR"
            , TypeSystemDirectiveLocation
OBJECT TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"OBJECT"
            , TypeSystemDirectiveLocation
FIELD_DEFINITION TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"FIELD_DEFINITION"
            , TypeSystemDirectiveLocation
ARGUMENT_DEFINITION TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"ARGUMENT_DEFINITION"
            , TypeSystemDirectiveLocation
INTERFACE TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"INTERFACE"
            , TypeSystemDirectiveLocation
UNION TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"UNION"
            , TypeSystemDirectiveLocation
ENUM TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"ENUM"
            , TypeSystemDirectiveLocation
ENUM_VALUE TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"ENUM_VALUE"
            , TypeSystemDirectiveLocation
INPUT_OBJECT TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"INPUT_OBJECT"
            , TypeSystemDirectiveLocation
INPUT_FIELD_DEFINITION TypeSystemDirectiveLocation
-> Parser Token ()
-> ParserT () [Token] [] TypeSystemDirectiveLocation
forall a b. a -> ParserT () [Token] [] b -> ParserT () [Token] [] a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ MisoString -> Parser Token ()
keyword MisoString
"INPUT_FIELD_DEFINITION"
            ]

-- | A GraphQL 'Name'
-- https://spec.graphql.org/draft/#Name
name :: Parser Token Name
name :: ParserT () [Token] [] Name
name =  do
    TokenName Name
name <- ParserT () [Token] [] Token
forall a. Parser a a
nextToken
    Name -> ParserT () [Token] [] Name
forall a. a -> ParserT () [Token] [] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Name
name

nameButNot :: [MisoString] -> Parser Token Name
nameButNot :: [MisoString] -> ParserT () [Token] [] Name
nameButNot [MisoString]
badNames = do
    Name MisoString
name <- ParserT () [Token] [] Name
name
    Bool -> Parser Token ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Parser Token ()) -> Bool -> Parser Token ()
forall a b. (a -> b) -> a -> b
$ MisoString -> [MisoString] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem MisoString
name [MisoString]
badNames
    pure $ MisoString -> Name
Name MisoString
name