Add definition module
This commit is contained in:
34
src/Language/GraphQL/AST/DirectiveLocation.hs
Normal file
34
src/Language/GraphQL/AST/DirectiveLocation.hs
Normal file
@ -0,0 +1,34 @@
|
||||
module Language.GraphQL.AST.DirectiveLocation
|
||||
( DirectiveLocation
|
||||
, ExecutableDirectiveLocation
|
||||
, TypeSystemDirectiveLocation
|
||||
) where
|
||||
|
||||
data DirectiveLocation
|
||||
= ExecutableDirectiveLocation ExecutableDirectiveLocation
|
||||
| TypeSystemDirectiveLocation TypeSystemDirectiveLocation
|
||||
deriving (Eq, Show)
|
||||
|
||||
data ExecutableDirectiveLocation
|
||||
= Query
|
||||
| Mutation
|
||||
| Subscription
|
||||
| Field
|
||||
| FragmentDefinition
|
||||
| FragmentSpread
|
||||
| InlineFragment
|
||||
deriving (Eq, Show)
|
||||
|
||||
data TypeSystemDirectiveLocation
|
||||
= Schema
|
||||
| Scalar
|
||||
| Object
|
||||
| FieldDefinition
|
||||
| ArgumentDefinition
|
||||
| Interface
|
||||
| Union
|
||||
| Enum
|
||||
| EnumValue
|
||||
| InputObject
|
||||
| InputFieldDefinition
|
||||
deriving (Eq, Show)
|
107
src/Language/GraphQL/AST/Document.hs
Normal file
107
src/Language/GraphQL/AST/Document.hs
Normal file
@ -0,0 +1,107 @@
|
||||
-- | This module defines data structures representing a GraphQL document.
|
||||
module Language.GraphQL.AST.Document
|
||||
( Definition(..)
|
||||
, Document
|
||||
, ExecutableDefinition(..)
|
||||
) where
|
||||
|
||||
import Data.List.NonEmpty (NonEmpty)
|
||||
import Data.Text (Text)
|
||||
import Language.GraphQL.AST
|
||||
( ExecutableDefinition(..)
|
||||
, Directive
|
||||
, Name
|
||||
, OperationType
|
||||
, Type
|
||||
, Value
|
||||
)
|
||||
import Language.GraphQL.AST.DirectiveLocation
|
||||
|
||||
-- | GraphQL document.
|
||||
type Document = NonEmpty Definition
|
||||
|
||||
type NamedType = Name
|
||||
|
||||
newtype Description = Description (Maybe Text)
|
||||
deriving (Eq, Show)
|
||||
|
||||
type RootOperationTypeDefinitions = NonEmpty RootOperationTypeDefinition
|
||||
|
||||
data RootOperationTypeDefinition
|
||||
= RootOperationTypeDefinition OperationType NamedType
|
||||
deriving (Eq, Show)
|
||||
|
||||
-- | All kinds of definitions that can occur in a GraphQL document.
|
||||
data Definition
|
||||
= ExecutableDefinition ExecutableDefinition
|
||||
| TypeSystemDefinition TypeSystemDefinition
|
||||
| TypeSystemExtension TypeSystemExtension
|
||||
deriving (Eq, Show)
|
||||
|
||||
data TypeSystemDefinition
|
||||
= SchemaDefinition [Directive] RootOperationTypeDefinitions
|
||||
| TypeDefinition TypeDefinition
|
||||
| DirectiveDefinition Description Name ArgumentsDefinition DirectiveLocation
|
||||
deriving (Eq, Show)
|
||||
|
||||
data SchemaExtension
|
||||
= SchemaOperationExtension [Directive] RootOperationTypeDefinitions
|
||||
| SchemaDirectiveExtension (NonEmpty Directive)
|
||||
deriving (Eq, Show)
|
||||
|
||||
data TypeSystemExtension
|
||||
= SchemaExtension SchemaExtension
|
||||
| TypeExtension TypeExtension
|
||||
deriving (Eq, Show)
|
||||
|
||||
newtype ImplementsInterfaces = ImplementsInterfaces (NonEmpty NamedType)
|
||||
deriving (Eq, Show)
|
||||
newtype ImplementsInterfacesOpt = ImplementsInterfacesOpt [NamedType]
|
||||
deriving (Eq, Show)
|
||||
|
||||
newtype UnionMemberTypes = UnionMemberTypes (NonEmpty NamedType)
|
||||
deriving (Eq, Show)
|
||||
newtype UnionMemberTypesOpt = UnionMemberTypesOpt [NamedType]
|
||||
deriving (Eq, Show)
|
||||
|
||||
newtype InputFieldsDefinition = InputFieldsDefinition (NonEmpty InputValueDefinition)
|
||||
deriving (Eq, Show)
|
||||
newtype InputFieldsDefinitionOpt = InputFieldsDefinitionOpt [InputValueDefinition]
|
||||
deriving (Eq, Show)
|
||||
|
||||
data InputValueDefinition
|
||||
= InputValueDefinition Description Name Type (Maybe Value) [Directive]
|
||||
deriving (Eq, Show)
|
||||
|
||||
newtype ArgumentsDefinition = ArgumentsDefinition [InputValueDefinition]
|
||||
deriving (Eq, Show)
|
||||
|
||||
data EnumValueDefinition = EnumValueDefinition Description Name [Directive]
|
||||
deriving (Eq, Show)
|
||||
|
||||
data FieldDefinition = FieldDefinition Description Name ArgumentsDefinition Type
|
||||
deriving (Eq, Show)
|
||||
|
||||
data TypeDefinition
|
||||
= ScalarTypeDefinition Description Name [Directive]
|
||||
| ObjectTypeDefinition Description Name ImplementsInterfacesOpt [Directive] [FieldDefinition]
|
||||
| InterfaceTypeDefinition Description Name [Directive] [FieldDefinition]
|
||||
| UnionTypeDefinition Description Name [Directive] UnionMemberTypesOpt
|
||||
| EnumTypeDefinition Description Name [Directive] [EnumValueDefinition]
|
||||
| InputObjectTypeDefinition Description Name [Directive] InputFieldsDefinitionOpt
|
||||
deriving (Eq, Show)
|
||||
|
||||
data TypeExtension
|
||||
= ScalarTypeExtension Name (NonEmpty Directive)
|
||||
| ObjectTypeFieldsDefinitionExtension Name ImplementsInterfacesOpt [Directive] (NonEmpty FieldDefinition)
|
||||
| ObjectTypeDirectivesExtension Name ImplementsInterfacesOpt (NonEmpty Directive)
|
||||
| ObjectTypeImplementsInterfacesExtension Name ImplementsInterfaces
|
||||
| InterfaceTypeFieldsDefinitionExtension Name [Directive] (NonEmpty FieldDefinition)
|
||||
| InterfaceTypeDirectivesExtension Name (NonEmpty Directive)
|
||||
| UnionTypeUnionMemberTypesExtension Name [Directive] UnionMemberTypes
|
||||
| UnionDirectivesExtension Name (NonEmpty Directive)
|
||||
| EnumTypeEnumValuesDefinitionExtension Name [Directive] (NonEmpty EnumValueDefinition)
|
||||
| EnumTypeDirectivesExtension Name (NonEmpty Directive)
|
||||
| InputObjectTypeInputFieldsDefinitionExtension Name [Directive] InputFieldsDefinition
|
||||
| InputObjectTypeDirectivesExtension Name (NonEmpty Directive)
|
||||
deriving (Eq, Show)
|
@ -26,6 +26,7 @@ import qualified Data.Text.Lazy.Builder as Builder
|
||||
import Data.Text.Lazy.Builder.Int (decimal, hexadecimal)
|
||||
import Data.Text.Lazy.Builder.RealFloat (realFloat)
|
||||
import qualified Language.GraphQL.AST as Full
|
||||
import Language.GraphQL.AST.Document
|
||||
|
||||
-- | Instructs the encoder whether the GraphQL document should be minified or
|
||||
-- pretty printed.
|
||||
@ -43,17 +44,18 @@ pretty = Pretty 0
|
||||
minified :: Formatter
|
||||
minified = Minified
|
||||
|
||||
-- | Converts a 'Full.Document' into a string.
|
||||
document :: Formatter -> Full.Document -> Lazy.Text
|
||||
-- | Converts a Document' into a string.
|
||||
document :: Formatter -> Document -> Lazy.Text
|
||||
document formatter defs
|
||||
| Pretty _ <- formatter = Lazy.Text.intercalate "\n" encodeDocument
|
||||
| Minified <-formatter = Lazy.Text.snoc (mconcat encodeDocument) '\n'
|
||||
where
|
||||
encodeDocument = foldr executableDefinition [] defs
|
||||
executableDefinition (Full.ExecutableDefinition x) acc = definition formatter x : acc
|
||||
executableDefinition (ExecutableDefinition x) acc = definition formatter x : acc
|
||||
executableDefinition _ acc = acc
|
||||
|
||||
-- | Converts a 'Full.Definition' into a string.
|
||||
definition :: Formatter -> Full.ExecutableDefinition -> Lazy.Text
|
||||
definition :: Formatter -> ExecutableDefinition -> Lazy.Text
|
||||
definition formatter x
|
||||
| Pretty _ <- formatter = Lazy.Text.snoc (encodeDefinition x) '\n'
|
||||
| Minified <- formatter = encodeDefinition x
|
||||
|
@ -9,14 +9,15 @@ module Language.GraphQL.AST.Parser
|
||||
import Control.Applicative (Alternative(..), optional)
|
||||
import Data.List.NonEmpty (NonEmpty(..))
|
||||
import Language.GraphQL.AST
|
||||
import qualified Language.GraphQL.AST.Document as Document
|
||||
import Language.GraphQL.AST.Lexer
|
||||
import Text.Megaparsec (lookAhead, option, try, (<?>))
|
||||
|
||||
-- | Parser for the GraphQL documents.
|
||||
document :: Parser Document
|
||||
document :: Parser Document.Document
|
||||
document = unicodeBOM
|
||||
>> spaceConsumer
|
||||
>> lexeme (manyNE $ ExecutableDefinition <$> definition)
|
||||
>> lexeme (manyNE $ Document.ExecutableDefinition <$> definition)
|
||||
|
||||
definition :: Parser ExecutableDefinition
|
||||
definition = DefinitionOperation <$> operationDefinition
|
||||
|
Reference in New Issue
Block a user