@@ -10,6 +10,7 @@ module Json.Encode
@@ -32,6 +33,7 @@ import qualified Data.Name as Name
32import qualified Data.Utf8 as Utf8
33import qualified Data.Utf8 as Utf8
34import qualified File
35import qualified File
36+import qualified Json.String as Json
@@ -40,7 +42,7 @@ import qualified File
42 = Array [Value]
44 = Array [Value]
43− | Object [(Utf8.String, Value)]
45+ | Object [(Json.String, Value)]
44 | String B.Builder
46 | String B.Builder
45 | Boolean Bool
47 | Boolean Bool
46 | Integer Int
48 | Integer Int
@@ -53,14 +55,14 @@ array =
56−object :: [(Utf8.String,Value)] -> Value
58+object :: [(Json.String, Value)] -> Value
61−string :: Utf8.String -> Value
63+string :: Json.String -> Value
62string str =
64string str =
63− String (encodeUtf8 str)
65+ String (B.char7 '"' <> Json.toBuilder str <> B.char7 '"')
66name :: Name.Name -> Value
68name :: Name.Name -> Value
@@ -68,6 +70,11 @@ name nm =
68 String (B.char7 '"' <> Name.toBuilder nm <> B.char7 '"')
70 String (B.char7 '"' <> Name.toBuilder nm <> B.char7 '"')
73+chars :: [Char] -> Value
75+ String (B.char7 '"' <> error "TODO escape this properly. Who is using this?" chrs <> B.char7 '"')
71bool :: Bool -> Value
78bool :: Bool -> Value
@@ -88,7 +95,7 @@ null =
91−dict :: (k -> Utf8.String) -> (v -> Value) -> Map.Map k v -> Value
98+dict :: (k -> Json.String) -> (v -> Value) -> Map.Map k v -> Value
92dict encodeKey encodeValue pairs =
99dict encodeKey encodeValue pairs =
93 Object $ map (encodeKey *** encodeValue) (Map.toList pairs)
100 Object $ map (encodeKey *** encodeValue) (Map.toList pairs)
@@ -102,9 +109,9 @@ list encodeEntry entries =
102-- HELPERS
109-- HELPERS
105−(==>) :: a -> b -> (a, b)
112+(==>) :: [Char] -> value -> (Json.String, value)
106−(==>) a b =
113+(==>) key value =
107− (a, b)
114+ (Json.fromChars key, value)
@@ -144,7 +151,7 @@ encodeUgly value =
144 Object (first : rest) ->
151 Object (first : rest) ->
146 encodeEntry char (key, entry) =
153 encodeEntry char (key, entry) =
147− B.char7 char <> encodeUtf8 key <> B.char7 ':' <> encodeUgly entry
154+ B.char7 char <> B.char7 '"' <> Utf8.toBuilder key <> B.string7 "\":" <> encodeUgly entry
149 encodeEntry '{' first <> mconcat (map (encodeEntry ',') rest) <> B.char7 '}'
156 encodeEntry '{' first <> mconcat (map (encodeEntry ',') rest) <> B.char7 '}'
@@ -205,15 +212,6 @@ encodeHelp indent value =
211−encodeUtf8 :: Utf8.String -> B.Builder
213− B.char7 '"' <> Utf8.toBuilder str <> B.char7 '"'
217-- ENCODE ARRAY
215-- ENCODE ARRAY
@@ -236,7 +234,7 @@ arrayClose =
236-- ENCODE OBJECT
234-- ENCODE OBJECT
239−encodeObject :: BSC.ByteString -> (Utf8.String, Value) -> [(Utf8.String, Value)] -> B.Builder
237+encodeObject :: BSC.ByteString -> (Json.String, Value) -> [(Json.String, Value)] -> B.Builder
240encodeObject =
238encodeObject =
241 encodeSequence objectOpen objectClose encodeField
239 encodeSequence objectOpen objectClose encodeField
@@ -251,9 +249,9 @@ objectClose =
251 B.char7 '}'
249 B.char7 '}'
254−encodeField :: BSC.ByteString -> (Utf8.String, Value) -> B.Builder
252+encodeField :: BSC.ByteString -> (Json.String, Value) -> B.Builder
255encodeField indent (key, value) =
253encodeField indent (key, value) =
256− encodeUtf8 key <> B.string7 ": " <> encodeHelp indent value
254+ B.char7 '"' <> Utf8.toBuilder key <> B.string7 "\": " <> encodeHelp indent value