summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2023-01-08 17:33:25 +0100
committerEugen Wissner <belka@caraus.de>2023-01-08 17:33:25 +0100
commitab4808c44de3e5cda60887ede92c8cff0d62ee90 (patch)
tree10cebe0fddd0377bc4e6d7259322ec0d67fcea32
parentbb4375313e91f4a4b8cf01e41ba25fd248fc392f (diff)
downloadgraphql-ab4808c44de3e5cda60887ede92c8cff0d62ee90.tar.gz
Encode unions
-rw-r--r--src/Language/GraphQL/AST/Encoder.hs22
-rw-r--r--tests/Language/GraphQL/AST/EncoderSpec.hs12
2 files changed, 33 insertions, 1 deletions
diff --git a/src/Language/GraphQL/AST/Encoder.hs b/src/Language/GraphQL/AST/Encoder.hs
index bd6dab8..ab17929 100644
--- a/src/Language/GraphQL/AST/Encoder.hs
+++ b/src/Language/GraphQL/AST/Encoder.hs
@@ -128,6 +128,13 @@ typeDefinition formatter = \case
<> optempty (directives formatter) directives'
<> eitherFormat formatter " " ""
<> bracesList formatter (fieldDefinition nextFormatter) fields'
+ Full.UnionTypeDefinition description' name' directives' members'
+ -> optempty (description formatter) description'
+ <> "union "
+ <> Lazy.Text.fromStrict name'
+ <> optempty (directives formatter) directives'
+ <> eitherFormat formatter " " ""
+ <> unionMemberTypes formatter members'
_typeDefinition' -> "" -- TODO: Types missing.
where
nextFormatter = incrementIndent formatter
@@ -136,10 +143,23 @@ implementsInterfaces :: Foldable t => Full.ImplementsInterfaces t -> Lazy.Text
implementsInterfaces (Full.ImplementsInterfaces interfaces)
| null interfaces = mempty
| otherwise = Lazy.Text.fromStrict
- $ Text.append "implements"
+ $ Text.append "implements "
$ Text.intercalate " & "
$ toList interfaces
+unionMemberTypes :: Foldable t => Formatter -> Full.UnionMemberTypes t -> Lazy.Text
+unionMemberTypes formatter (Full.UnionMemberTypes memberTypes)
+ | null memberTypes = mempty
+ | Minified <- formatter = Lazy.Text.fromStrict
+ $ Text.append "= "
+ $ Text.intercalate " | "
+ $ toList memberTypes
+ | Pretty _ <- formatter
+ = Lazy.Text.append "="
+ $ Lazy.Text.concat
+ $ (("\n" <> indentSymbol <> "| ") <>) . Lazy.Text.fromStrict
+ <$> toList memberTypes
+
description :: Formatter -> Full.Description -> Lazy.Text.Text
description _formatter (Full.Description Nothing) = ""
description formatter (Full.Description (Just description')) =
diff --git a/tests/Language/GraphQL/AST/EncoderSpec.hs b/tests/Language/GraphQL/AST/EncoderSpec.hs
index 862fa34..5116c0e 100644
--- a/tests/Language/GraphQL/AST/EncoderSpec.hs
+++ b/tests/Language/GraphQL/AST/EncoderSpec.hs
@@ -217,3 +217,15 @@ spec = do
|]
actual = typeSystemDefinition pretty definition'
in actual `shouldBe` expected
+
+ it "encodes an enum definition" $
+ let definition' = Full.TypeDefinition
+ $ Full.UnionTypeDefinition mempty "SearchResult" mempty
+ $ Full.UnionMemberTypes ["Photo", "Person"]
+ expected = [gql|
+ union SearchResult =
+ | Photo
+ | Person
+ |]
+ actual = typeSystemDefinition pretty definition'
+ in actual `shouldBe` expected