on master help sign in
Introduce a string encoder
commit7c3a89c236e8db6d4c328a09303dfd319c2ffbd1 authorBryan O'Sullivan <bos@serpentine.com> dateMon 6 Jul 2015, 17:02 (11 years ago) parent97bef52
1 file changed+9
Data/Aeson/Encode/Builder.hs+9
Data/Aeson/Encode/Builder.hs+9
@@ -21,6 +21,7 @@ module Data.Aeson.Encode.Builder
2121 , emptyObject_
2222 , object
2323 , text
24+ , string
2425 , unquoted
2526 , number
2627 , ascii2
@@ -33,6 +34,7 @@ import Data.ByteString.Builder as B
3334import Data.ByteString.Builder.Prim as BP
3435import Data.ByteString.Builder.Scientific (scientificBuilder)
3536import Data.Char (ord)
37+import Data.Foldable (foldMap)
3638import Data.Monoid ((<>))
3739import Data.Scientific (Scientific, base10Exponent, coefficient)
3840import Data.Word (Word8)
@@ -89,6 +91,12 @@ text t = B.char8 '"' <> unquoted t <> B.char8 '"'
8991unquoted :: T.Text -> Builder
9092unquoted t = TE.encodeUtf8BuilderEscaped escapeAscii t
9193
94+-- | Encode a JSON string.
95+string :: String -> Builder
96+string t = B.char8 '"' <> foldMap go t <> B.char8 '"'
97+ where go c | c > '\x7f' = B.charUtf8 c
98+ | otherwise = BP.primBounded escapeAscii (c2w c)
99+
92100escapeAscii :: BP.BoundedPrim Word8
93101escapeAscii =
94102 BP.condB (== c2w '\\' ) (ascii2 ('\\','\\')) $
@@ -102,6 +110,7 @@ escapeAscii =
102110 hexEscape :: BP.FixedPrim Word8
103111 hexEscape = (\c -> ('\\', ('u', fromIntegral c))) BP.>$<
104112 BP.char8 >*< BP.char8 >*< BP.word16HexFixed
113+{-# INLINE escapeAscii #-}
105114
106115c2w :: Char -> Word8
107116c2w c = fromIntegral (ord c)