morpheus-graphql-0.5.0: src/Data/Morpheus/Parsing/Internal/Pattern.hs
module Data.Morpheus.Parsing.Internal.Pattern
( inputValueDefinition
, fieldsDefinition
, typDeclaration
, optionalDirectives
) where
import Text.Megaparsec (label, many)
-- MORPHEUS
import Data.Morpheus.Parsing.Internal.Create (createField)
import Data.Morpheus.Parsing.Internal.Internal (Parser)
import Data.Morpheus.Parsing.Internal.Terms (keyword, optDescription, litAssignment, operator, parseAssignment,
parseMaybeTuple, parseName, parseType, setOf)
import Data.Morpheus.Parsing.Internal.Value (parseDefaultValue, parseValue)
import Data.Morpheus.Types.Internal.Data (DataField, Key, Name)
-- InputValue : https://graphql.github.io/graphql-spec/June2018/#InputValueDefinition
--
-- InputValueDefinition
-- Description(opt) Name : Type DefaultValue(opt) Directives (Const)(opt)
--
inputValueDefinition :: Parser (Key, DataField)
inputValueDefinition = label "InputValueDefinition" $ do
-- TODO: handle Description(opt)
_description <- optDescription
name <- parseName
litAssignment -- ':'
type_ <- parseType
-- TODO: handle default value
_ <- parseDefaultValue
_ <- optionalDirectives
pure (name, createField [] name type_)
-- Field Arguments: https://graphql.github.io/graphql-spec/June2018/#sec-Field-Arguments
--
-- ArgumentsDefinition:
-- ( InputValueDefinition(list) )
--
argumentsDefinition :: Parser [(Key, DataField)]
argumentsDefinition = label "ArgumentsDefinition" $ parseMaybeTuple inputValueDefinition
-- FieldsDefinition : https://graphql.github.io/graphql-spec/June2018/#FieldsDefinition
--
-- FieldsDefinition :
-- { FieldDefinition(list) }
--
fieldsDefinition :: Parser [(Key, DataField)]
fieldsDefinition = label "FieldsDefinition" $ setOf fieldDefinition
-- FieldDefinition
-- Description(opt) Name ArgumentsDefinition(opt) : Type Directives(Const)(opt)
--
fieldDefinition :: Parser (Key, DataField)
fieldDefinition = label "FieldDefinition" $ do
-- TODO: handle Description(opt)
_description <- optDescription
name <- parseName
args <- argumentsDefinition
litAssignment -- ':'
type_ <- parseType
-- TODO: handle directives
_ <- optionalDirectives
pure (name, createField args name type_)
-- Directives : https://graphql.github.io/graphql-spec/June2018/#sec-Language.Directives
--
-- example: @directive ( arg1: "value" , .... )
--
-- Directives[Const]
-- Directive[Const](list)
--
optionalDirectives :: Parser [()]
optionalDirectives = label "Directives" $ many directive
-- Directive[Const]
--
-- @ Name Arguments[Const](opt)
-- TODO: returns real DataType
directive :: Parser ()
directive = label "Directive" $ do
operator '@'
_name <- parseName
_args <- parseMaybeTuple (parseAssignment parseName parseValue)
pure ()
-- typDeclaration : Not in spec ,start part of type definitions
--
-- typDeclaration
-- Description(opt) scalar Name
--
typDeclaration :: Name -> Parser Name
typDeclaration kind = do
keyword kind
parseName