Login
7 branches 0 tags
Ben (X13/Arch) Switched from AoT to JIT symbol lookup/linking. 2a5e601 3 years ago 616 Commits
nujel / stdlib / serialization / json.nuj
;; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
;; This project uses the MIT license, a copy should be included under /LICENSE
;;
;; Contains subroutines for (de-)serializing JSON
[defn tree->json [v]
  "Converts a tree into a JSON encoded string, you should prefer VAL->JSON"
  [cat "{"
       [join [map [tree/keys v]
                  [fn [k]
                      [cat "\"" [keyword->string k] "\": "
                           [val->json [tree/ref v k]]]]]
             ",\n"]
       "}"]]

[defn val->json [v]
  "Return V as a JSON encoded string"
  [case [type-of v]
    [:nil "null"]
    [[:int :float] [string v]]
    [:bool [if v "true" "false"]]
    [[:array :pair] [cat "[" [join [map v val->json] ","] "]"]]
    [:string [str/write v]]
    [:symbol [cat "\"" [sym->str v] "\""]]
    [:keyword [cat "\"" [keyword->string v] "\""]]
    [:tree [tree->json v]]
    [otherwise [throw [list :type-error "Can't encode the value into JSON" v [current-lambda]]]]]]