Login
7 branches 0 tags
Ben (X13/Arch) Simplified things a little 0643405 9 days ago 1260 Commits
;;; 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 (:keys v)
                      (fn (k)
                        (cat "\"" (:string k) "\": "
                             (val->json (ref v k)))))
                 ",\n")
           "}"))

(defn val->json (v)
      :export-as serialize
      "Return V as a JSON encoded string"
      (case (:type-name v)
            (:nil "null")
            ((:int :float) (:string v))
            (:bool (if v "true" "false"))
            ((:array :pair) (cat "[" (join (map v val->json) ",") "]"))
            (:string (string/write v))
            ((:symbol :keyword)  (cat "\"" (:string v) "\""))
            (:tree (tree->json v))
            (otherwise (exception :type-error "Can't encode the value into JSON" v))))

(deftest "null" (serialization/json/serialize #nil))
(deftest "123" (serialization/json/serialize 123))
(deftest "123.123" (serialization/json/serialize 123.123))
(deftest "true" (serialization/json/serialize #t))
(deftest "false" (serialization/json/serialize #f))
(deftest "[1,2,3]" (serialization/json/serialize [1 2 3]))
(deftest "[1,true,3.0]" (serialization/json/serialize '(1 #t 3.0)))
(deftest "\"asd\"" (serialization/json/serialize 'asd))
(deftest "\"asd\"" (serialization/json/serialize :asd))
(deftest "\"asd\"" (serialization/json/serialize "asd"))
(deftest "\"asd\"" (serialization/json/serialize "asd"))
(deftest "{\"asd\": null}" (serialization/json/serialize {:asd #nil}))
(deftest "{\"asd\": \"asd\"}" (serialization/json/serialize {:asd :asd}))
(deftest "{\"asd\": 123}" (serialization/json/serialize {:asd 123}))