diff --git a/src/Language/GraphQL/AST/Encoder.hs b/src/Language/GraphQL/AST/Encoder.hs index d19b9e6..8dddd1f 100644 --- a/src/Language/GraphQL/AST/Encoder.hs +++ b/src/Language/GraphQL/AST/Encoder.hs @@ -81,6 +81,31 @@ typeSystemDefinition formatter = \case <> colon formatter <> Lazy.Text.fromStrict namedType' +fieldDefinition :: Formatter -> Full.FieldDefinition -> Lazy.Text.Text +fieldDefinition formatter fieldDefinition' = + let Full.FieldDefinition description' name' arguments' type'' directives' = fieldDefinition' + in optempty (description formatter) description' + <> indentLine formatter + <> Lazy.Text.fromStrict name' + <> argumentsDefinition formatter arguments' + <> colon formatter + <> type' type'' + <> optempty (directives formatter) directives' + +argumentsDefinition :: Formatter -> Full.ArgumentsDefinition -> Lazy.Text.Text +argumentsDefinition formatter (Full.ArgumentsDefinition arguments') = + parensCommas formatter (argumentDefinition formatter) arguments' + +argumentDefinition :: Formatter -> Full.InputValueDefinition -> Lazy.Text.Text +argumentDefinition formatter definition' = + let Full.InputValueDefinition description' name' type'' defaultValue' directives' = definition' + in optempty (description formatter) description' + <> Lazy.Text.fromStrict name' + <> colon formatter + <> type' type'' + <> maybe mempty (defaultValue formatter . Full.node) defaultValue' + <> directives formatter directives' + typeDefinition :: Formatter -> Full.TypeDefinition -> Lazy.Text.Text typeDefinition formatter = \case Full.ScalarTypeDefinition description' name' directives' @@ -88,7 +113,16 @@ typeDefinition formatter = \case <> "scalar " <> Lazy.Text.fromStrict name' <> optempty (directives formatter) directives' + Full.InterfaceTypeDefinition description' name' directives' fields' + -> optempty (description formatter) description' + <> "interface " + <> Lazy.Text.fromStrict name' + <> optempty (directives formatter) directives' + <> eitherFormat formatter " " "" + <> bracesList formatter (fieldDefinition nextFormatter) fields' _typeDefinition' -> "" -- TODO: Types missing. + where + nextFormatter = incrementIndent formatter description :: Formatter -> Full.Description -> Lazy.Text.Text description _formatter (Full.Description Nothing) = "" @@ -243,8 +277,10 @@ directive formatter (Full.Directive name args _) = "@" <> Lazy.Text.fromStrict name <> optempty (arguments formatter) args directives :: Formatter -> [Full.Directive] -> Lazy.Text -directives Minified = spaces (directive Minified) -directives formatter = Lazy.Text.cons ' ' . spaces (directive formatter) +directives Minified values = spaces (directive Minified) values +directives formatter values + | null values = "" + | otherwise = Lazy.Text.cons ' ' $ spaces (directive formatter) values -- | Converts a 'Full.Value' into a string. value :: Formatter -> Full.Value -> Lazy.Text diff --git a/tests/Language/GraphQL/AST/EncoderSpec.hs b/tests/Language/GraphQL/AST/EncoderSpec.hs index 6b424d5..862fa34 100644 --- a/tests/Language/GraphQL/AST/EncoderSpec.hs +++ b/tests/Language/GraphQL/AST/EncoderSpec.hs @@ -201,3 +201,19 @@ spec = do expected = "scalar UUID" actual = typeSystemDefinition pretty definition' in actual `shouldBe` expected + + it "encodes an interface definition" $ + let someType = Full.TypeNamed "String" + argument = Full.InputValueDefinition mempty "arg" someType Nothing mempty + arguments = Full.ArgumentsDefinition [argument] + definition' = Full.TypeDefinition + $ Full.InterfaceTypeDefinition mempty "UUID" mempty + $ pure + $ Full.FieldDefinition mempty "value" arguments someType mempty + expected = [gql| + interface UUID { + value(arg: String): String + } + |] + actual = typeSystemDefinition pretty definition' + in actual `shouldBe` expected