Escape non-source characters in the encoder

This commit is contained in:
Eugen Wissner 2019-12-19 06:59:27 +01:00
parent 0cbe69736b
commit 9a5d54c035
3 changed files with 16 additions and 7 deletions

View File

@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file.
- Fragment spread is evaluated based on the `__typename` resolver. If the
resolver is missing, it is assumed that the type condition is satisfied (all
fragments are included).
- Escaping characters during encoding.
### Added
- Directive support (@skip and @include).

View File

@ -18,6 +18,7 @@ import Data.Monoid ((<>))
import qualified Data.List.NonEmpty as NonEmpty (toList)
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as Text.Lazy
import qualified Data.Text.Lazy.Builder as Builder
import Data.Text.Lazy.Builder (toLazyText)
import Data.Text.Lazy.Builder.Int (decimal)
import Data.Text.Lazy.Builder.RealFloat (realFloat)
@ -191,10 +192,18 @@ booleanValue True = "true"
booleanValue False = "false"
stringValue :: Text -> Text
stringValue
= quotes
. Text.Lazy.replace "\"" "\\\""
. Text.Lazy.replace "\\" "\\\\"
stringValue string = Builder.toLazyText
$ quote
<> Text.Lazy.foldr replace quote string
where
replace '\\' = mappend $ Builder.fromLazyText "\\\\"
replace '\"' = mappend $ Builder.fromLazyText "\\\""
replace '\b' = mappend $ Builder.fromLazyText "\\b"
replace '\f' = mappend $ Builder.fromLazyText "\\f"
replace '\n' = mappend $ Builder.fromLazyText "\\n"
replace '\r' = mappend $ Builder.fromLazyText "\\r"
replace char = mappend $ Builder.singleton char
quote = Builder.singleton '\"'
listValue :: Formatter -> [Full.Value] -> Text
listValue formatter = bracketsCommas formatter $ value formatter
@ -243,9 +252,6 @@ brackets = between '[' ']'
braces :: Text -> Text
braces = between '{' '}'
quotes :: Text -> Text
quotes = between '"' '"'
spaces :: forall a. (a -> Text) -> [a] -> Text
spaces f = Text.Lazy.intercalate "\SP" . fmap f

View File

@ -17,3 +17,5 @@ spec = describe "value" $ do
value minified (String "\\") `shouldBe` "\"\\\\\""
it "escapes quotes" $
value minified (String "\"") `shouldBe` "\"\\\"\""
it "escapes backspace" $
value minified (String "a\bc") `shouldBe` "\"a\\bc\""