Skip to content

Commit 95f390e

Browse files
committed
feat(dict): add dict:asJson
1 parent 87a9c37 commit 95f390e

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

Dict.ark

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,54 @@
277277
(let _key (@ _keys _i))
278278
(add _D _key (get _D2 _key))
279279
(set _i (+ 1 _i)) }) }))
280+
281+
(let _valAsJson (fun (_val)
282+
(if (= "Dict" (type _val))
283+
(asJson _val)
284+
(if (= "String" (type _val))
285+
(+ "\"" _val "\"")
286+
(if (= "List" (type _val))
287+
(_listAsJson _val)
288+
(if (nil? _val)
289+
"null"
290+
(toString _val)))))))
291+
292+
(let _listAsJson (fun ((ref _L)) {
293+
(mut _output "[")
294+
(mut _i 0)
295+
(while (< _i (len _L)) {
296+
(set _output
297+
(+
298+
_output
299+
(_valAsJson (@ _L _i))
300+
(if (= (len _L) (+ 1 _i))
301+
""
302+
", ")))
303+
(set _i (+ 1 _i)) })
304+
305+
(+ _output "]") }))
306+
307+
(let asJson (fun (_D) {
308+
(mut _output [])
309+
(let _keys (keys _D))
310+
(mut _i 0)
311+
(while (< _i (len _keys)) {
312+
(let _key (@ _keys _i))
313+
(let _val (_valAsJson (get _D _key)))
314+
315+
(append! _output (format "\"{}\": {}" _key _val))
316+
(set _i (+ 1 _i)) })
317+
318+
(mut _as_str "")
319+
(set _i 0)
320+
(while (< _i (len _output)) {
321+
(set _as_str
322+
(+
323+
_as_str
324+
(@ _output _i)
325+
(if (= (len _output) (+ 1 _i))
326+
""
327+
", ")))
328+
(set _i (+ 1 _i)) })
329+
330+
(+ "{" _as_str "}") }))

tests/dict-tests.ark

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@
149149
(let empty_filtered (dict:filter empty filter_str_keys))
150150
(test:eq (dict:size empty_filtered) 0) })
151151

152+
(test:case "asJson" {
153+
(test:eq (dict:asJson empty) "{}")
154+
(test:eq (dict:asJson d2) "{\"a\": 1, \"b\": 2, \"c\": 3}")
155+
(test:eq (dict:asJson (dict "a" "hello" "b" d2)) "{\"a\": \"hello\", \"b\": {\"a\": 1, \"b\": 2, \"c\": 3}}")
156+
(test:eq (dict:asJson (dict "a" [1 "2" true [false 3 4] [] nil])) "{\"a\": [1, \"2\", true, [false, 3, 4], [], null]}") })
157+
152158
(test:case "filter!" {
153159
(dict:filter! d2 filter_odd)
154160
(test:eq (dict:size d2) 2)

0 commit comments

Comments
 (0)