diff options
| author | Eugen Wissner <belka@caraus.de> | 2020-01-07 13:56:58 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2020-01-13 08:21:02 +0100 |
| commit | f4ed06741dedb7b19cedc09b1c47afe1f0849f24 (patch) | |
| tree | b4ae8cf28d7ec7dc0c833bde6ccdf67ca82fcc3c /src/Language/GraphQL/AST/Document.hs | |
| parent | 8efb08fda157770afb836537b27c2cd55042b706 (diff) | |
| download | graphql-f4ed06741dedb7b19cedc09b1c47afe1f0849f24.tar.gz | |
Parse union definitions
Diffstat (limited to 'src/Language/GraphQL/AST/Document.hs')
| -rw-r--r-- | src/Language/GraphQL/AST/Document.hs | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/src/Language/GraphQL/AST/Document.hs b/src/Language/GraphQL/AST/Document.hs index 619a6f3..74c6ce2 100644 --- a/src/Language/GraphQL/AST/Document.hs +++ b/src/Language/GraphQL/AST/Document.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE OverloadedStrings #-} + -- | This module defines an abstract syntax tree for the @GraphQL@ language. It -- follows closely the structure given in the specification. Please refer to -- <https://facebook.github.io/graphql/ Facebook's GraphQL Specification>. @@ -14,9 +16,9 @@ module Language.GraphQL.AST.Document , FieldDefinition(..) , FragmentDefinition(..) , ImplementsInterfaces(..) - , ImplementsInterfacesOpt(..) , InputValueDefinition(..) , Name + , NamedType , NonNullType(..) , ObjectField(..) , OperationDefinition(..) @@ -29,14 +31,18 @@ module Language.GraphQL.AST.Document , Type(..) , TypeCondition , TypeDefinition(..) + , TypeExtension(..) , TypeSystemDefinition(..) + , UnionMemberTypes(..) , Value(..) , VariableDefinition(..) ) where +import Data.Foldable (toList) import Data.Int (Int32) import Data.List.NonEmpty (NonEmpty) import Data.Text (Text) +import qualified Data.Text as Text import Language.GraphQL.AST.DirectiveLocation -- * Language @@ -274,9 +280,13 @@ newtype Description = Description (Maybe Text) data TypeDefinition = ScalarTypeDefinition Description Name [Directive] | ObjectTypeDefinition - Description Name ImplementsInterfacesOpt [Directive] [FieldDefinition] + Description + Name + (ImplementsInterfaces []) + [Directive] + [FieldDefinition] | InterfaceTypeDefinition Description Name [Directive] [FieldDefinition] - | UnionTypeDefinition Description Name [Directive] UnionMemberTypesOpt + | UnionTypeDefinition Description Name [Directive] (UnionMemberTypes []) | EnumTypeDefinition Description Name [Directive] [EnumValueDefinition] | InputObjectTypeDefinition Description Name [Directive] InputFieldsDefinitionOpt @@ -285,14 +295,16 @@ data TypeDefinition data TypeExtension = ScalarTypeExtension Name (NonEmpty Directive) | ObjectTypeFieldsDefinitionExtension - Name ImplementsInterfacesOpt [Directive] (NonEmpty FieldDefinition) + Name (ImplementsInterfaces []) [Directive] (NonEmpty FieldDefinition) | ObjectTypeDirectivesExtension - Name ImplementsInterfacesOpt (NonEmpty Directive) - | ObjectTypeImplementsInterfacesExtension Name ImplementsInterfaces + Name (ImplementsInterfaces []) (NonEmpty Directive) + | ObjectTypeImplementsInterfacesExtension + Name (ImplementsInterfaces NonEmpty) | InterfaceTypeFieldsDefinitionExtension Name [Directive] (NonEmpty FieldDefinition) | InterfaceTypeDirectivesExtension Name (NonEmpty Directive) - | UnionTypeUnionMemberTypesExtension Name [Directive] UnionMemberTypes + | UnionTypeUnionMemberTypesExtension + Name [Directive] (UnionMemberTypes NonEmpty) | UnionDirectivesExtension Name (NonEmpty Directive) | EnumTypeEnumValuesDefinitionExtension Name [Directive] (NonEmpty EnumValueDefinition) @@ -304,17 +316,17 @@ data TypeExtension -- ** Objects -newtype ImplementsInterfaces = ImplementsInterfaces (NonEmpty NamedType) - deriving (Eq, Show) -newtype ImplementsInterfacesOpt = ImplementsInterfacesOpt [NamedType] - deriving (Eq, Show) +newtype ImplementsInterfaces t = ImplementsInterfaces (t NamedType) -instance Semigroup ImplementsInterfacesOpt where - (ImplementsInterfacesOpt xs) <> (ImplementsInterfacesOpt ys) = - ImplementsInterfacesOpt $ xs <> ys +instance Foldable t => Eq (ImplementsInterfaces t) where + (ImplementsInterfaces xs) == (ImplementsInterfaces ys) + = toList xs == toList ys -instance Monoid ImplementsInterfacesOpt where - mempty = ImplementsInterfacesOpt [] +instance Foldable t => Show (ImplementsInterfaces t) where + show (ImplementsInterfaces interfaces) = Text.unpack + $ Text.append "implements" + $ Text.intercalate " & " + $ toList interfaces data FieldDefinition = FieldDefinition Description Name ArgumentsDefinition Type [Directive] @@ -336,11 +348,15 @@ data InputValueDefinition -- ** Unions -newtype UnionMemberTypes = UnionMemberTypes (NonEmpty NamedType) - deriving (Eq, Show) +newtype UnionMemberTypes t = UnionMemberTypes (t NamedType) -newtype UnionMemberTypesOpt = UnionMemberTypesOpt [NamedType] - deriving (Eq, Show) +instance Foldable t => Eq (UnionMemberTypes t) where + (UnionMemberTypes xs) == (UnionMemberTypes ys) = toList xs == toList ys + +instance Foldable t => Show (UnionMemberTypes t) where + show (UnionMemberTypes memberTypes) = Text.unpack + $ Text.intercalate " | " + $ toList memberTypes -- ** Enums |
