Add support for default transit handler #36
This commit is contained in:
parent
6214f06146
commit
37326045aa
8 changed files with 76 additions and 29 deletions
|
|
@ -15,8 +15,11 @@
|
||||||
([pod-id-or-pod sym args] (invoke pod-id-or-pod sym args {}))
|
([pod-id-or-pod sym args] (invoke pod-id-or-pod sym args {}))
|
||||||
([pod-id-or-pod sym args opts] (jvm/invoke pod-id-or-pod sym args opts)))
|
([pod-id-or-pod sym args opts] (jvm/invoke pod-id-or-pod sym args opts)))
|
||||||
|
|
||||||
(defn add-transit-read-handler [tag fn]
|
(defn add-transit-read-handler! [tag fn]
|
||||||
(jvm/add-transit-read-handler tag fn))
|
(jvm/add-transit-read-handler! tag fn))
|
||||||
|
|
||||||
(defn add-transit-write-handler [tag fn classes]
|
(defn add-transit-write-handler! [tag fn classes]
|
||||||
(jvm/add-transit-write-handler tag fn classes))
|
(jvm/add-transit-write-handler! tag fn classes))
|
||||||
|
|
||||||
|
(defn set-transit-default-write-handler! [tag-fn val-fn]
|
||||||
|
(jvm/set-transit-default-write-handler! tag-fn val-fn))
|
||||||
|
|
|
||||||
|
|
@ -54,11 +54,12 @@
|
||||||
(transit/read r))))
|
(transit/read r))))
|
||||||
|
|
||||||
;; https://www.cognitect.com/blog/2015/9/10/extending-transit
|
;; https://www.cognitect.com/blog/2015/9/10/extending-transit
|
||||||
(defn add-transit-read-handler [tag fn]
|
(defn add-transit-read-handler!
|
||||||
(let [rh (transit/read-handler fn)]
|
([tag fn]
|
||||||
(swap! transit-read-handlers assoc-in [*pod-id* tag] rh)
|
(let [rh (transit/read-handler fn)]
|
||||||
(update-transit-read-handler-map)
|
(swap! transit-read-handlers assoc-in [*pod-id* tag] rh)
|
||||||
nil))
|
(update-transit-read-handler-map)
|
||||||
|
nil)))
|
||||||
|
|
||||||
(defonce transit-write-handlers (atom {}))
|
(defonce transit-write-handlers (atom {}))
|
||||||
(defonce transit-write-handler-maps (atom {}))
|
(defonce transit-write-handler-maps (atom {}))
|
||||||
|
|
@ -68,16 +69,23 @@
|
||||||
(transit/write-handler-map (get @transit-write-handlers *pod-id*))))
|
(transit/write-handler-map (get @transit-write-handlers *pod-id*))))
|
||||||
|
|
||||||
;; https://www.cognitect.com/blog/2015/9/10/extending-transit
|
;; https://www.cognitect.com/blog/2015/9/10/extending-transit
|
||||||
(defn add-transit-write-handler [tag fn classes]
|
(defn add-transit-write-handler! [tag fn classes]
|
||||||
(let [rh (transit/write-handler tag fn)]
|
(let [rh (transit/write-handler tag fn)]
|
||||||
(doseq [class classes]
|
(doseq [class classes]
|
||||||
(swap! transit-write-handlers assoc-in [*pod-id* class] rh)))
|
(swap! transit-write-handlers assoc-in [*pod-id* class] rh)))
|
||||||
(update-transit-write-handler-map)
|
(update-transit-write-handler-map)
|
||||||
nil)
|
nil)
|
||||||
|
|
||||||
|
(defonce transit-default-write-handlers (atom {}))
|
||||||
|
|
||||||
|
(defn set-transit-default-write-handler! [tag-fn val-fn]
|
||||||
|
(let [wh (transit/write-handler tag-fn val-fn)]
|
||||||
|
(swap! transit-default-write-handlers assoc *pod-id* wh)))
|
||||||
|
|
||||||
(defn transit-json-write [pod-id ^String s]
|
(defn transit-json-write [pod-id ^String s]
|
||||||
(with-open [baos (java.io.ByteArrayOutputStream. 4096)]
|
(with-open [baos (java.io.ByteArrayOutputStream. 4096)]
|
||||||
(let [w (transit/writer baos :json {:handlers (get @transit-write-handler-maps pod-id)})]
|
(let [w (transit/writer baos :json {:handlers (get @transit-write-handler-maps pod-id)
|
||||||
|
:default-handler (get @transit-default-write-handlers pod-id)})]
|
||||||
(transit/write w s)
|
(transit/write w s)
|
||||||
(str baos))))
|
(str baos))))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -71,8 +71,11 @@
|
||||||
([pod-id sym args] (invoke pod-id sym args {}))
|
([pod-id sym args] (invoke pod-id sym args {}))
|
||||||
([pod-id sym args opts] (impl/invoke-public pod-id sym args opts)))
|
([pod-id sym args opts] (impl/invoke-public pod-id sym args opts)))
|
||||||
|
|
||||||
(defn add-transit-read-handler [tag fn]
|
(defn add-transit-read-handler! [tag fn]
|
||||||
(impl/add-transit-read-handler tag fn))
|
(impl/add-transit-read-handler! tag fn))
|
||||||
|
|
||||||
(defn add-transit-write-handler [tag fn classes]
|
(defn add-transit-write-handler! [tag fn classes]
|
||||||
(impl/add-transit-write-handler tag fn classes))
|
(impl/add-transit-write-handler! tag fn classes))
|
||||||
|
|
||||||
|
(defn set-transit-default-write-handler! [tag-fn val-fn]
|
||||||
|
(impl/set-transit-default-write-handler! tag-fn val-fn))
|
||||||
|
|
|
||||||
|
|
@ -81,8 +81,11 @@
|
||||||
([pod-id sym args] (invoke pod-id sym args {}))
|
([pod-id sym args] (invoke pod-id sym args {}))
|
||||||
([pod-id sym args opts] (impl/invoke-public pod-id sym args opts)))
|
([pod-id sym args opts] (impl/invoke-public pod-id sym args opts)))
|
||||||
|
|
||||||
(defn add-transit-read-handler [tag fn]
|
(defn add-transit-read-handler! [tag fn]
|
||||||
(impl/add-transit-read-handler tag fn))
|
(impl/add-transit-read-handler! tag fn))
|
||||||
|
|
||||||
(defn add-transit-write-handler [tag fn classes]
|
(defn add-transit-write-handler! [tag fn classes]
|
||||||
(impl/add-transit-write-handler tag fn classes))
|
(impl/add-transit-write-handler! tag fn classes))
|
||||||
|
|
||||||
|
(defn set-transit-default-write-handler! [tag-fn val-fn]
|
||||||
|
(impl/set-transit-default-write-handler! tag-fn val-fn))
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,11 @@
|
||||||
{"local-date-time"
|
{"local-date-time"
|
||||||
(transit/read-handler
|
(transit/read-handler
|
||||||
(fn [s]
|
(fn [s]
|
||||||
(java.time.LocalDateTime/parse s)))}})]
|
(java.time.LocalDateTime/parse s)))
|
||||||
|
"java.array"
|
||||||
|
(transit/read-handler
|
||||||
|
(fn [v]
|
||||||
|
(into-array v)))}})]
|
||||||
(transit/read r))))
|
(transit/read r))))
|
||||||
|
|
||||||
(defn transit-json-write [s]
|
(defn transit-json-write [s]
|
||||||
|
|
@ -49,7 +53,11 @@
|
||||||
{java.time.LocalDateTime
|
{java.time.LocalDateTime
|
||||||
(transit/write-handler
|
(transit/write-handler
|
||||||
"local-date-time"
|
"local-date-time"
|
||||||
str)}})]
|
str)}
|
||||||
|
:default-handler
|
||||||
|
(transit/write-handler
|
||||||
|
(fn [x] (when (.isArray (class x)) "java.array"))
|
||||||
|
vec)})]
|
||||||
(transit/write w s)
|
(transit/write w s)
|
||||||
(str baos))))
|
(str baos))))
|
||||||
|
|
||||||
|
|
@ -121,14 +129,26 @@
|
||||||
{"name" "read-other-tag"
|
{"name" "read-other-tag"
|
||||||
"code" "(defn read-other-tag [x] [x x])"}
|
"code" "(defn read-other-tag [x] [x x])"}
|
||||||
{"name" "-local-date-time"}
|
{"name" "-local-date-time"}
|
||||||
{"name" "local-date-time"
|
{"name" "transit-stuff"
|
||||||
"code" "
|
"code" "
|
||||||
(babashka.pods/add-transit-read-handler \"local-date-time\"
|
(babashka.pods/add-transit-read-handler! \"local-date-time\"
|
||||||
(fn [s] (java.time.LocalDateTime/parse s)))
|
(fn [s] (java.time.LocalDateTime/parse s)))
|
||||||
(babashka.pods/add-transit-write-handler \"local-date-time\"
|
|
||||||
|
(babashka.pods/add-transit-write-handler! \"local-date-time\"
|
||||||
str #{java.time.LocalDateTime})
|
str #{java.time.LocalDateTime})
|
||||||
|
|
||||||
(defn local-date-time [x]
|
(defn local-date-time [x]
|
||||||
(-local-date-time x))"}]
|
(-local-date-time x))
|
||||||
|
|
||||||
|
;; serialize Java arrays as vectors with tag java.array
|
||||||
|
(babashka.pods/set-transit-default-write-handler!
|
||||||
|
(fn [x] (when (.isArray (class x)) \"java.array\"))
|
||||||
|
vec)
|
||||||
|
|
||||||
|
(babashka.pods/add-transit-read-handler! \"java.array\"
|
||||||
|
into-array)
|
||||||
|
|
||||||
|
"}]
|
||||||
dependents)}
|
dependents)}
|
||||||
{"name" "pod.test-pod.loaded"
|
{"name" "pod.test-pod.loaded"
|
||||||
"defer" "true"}
|
"defer" "true"}
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,12 @@
|
||||||
(instance? java.time.LocalDateTime (pod.test-pod/local-date-time (java.time.LocalDateTime/now)))
|
(instance? java.time.LocalDateTime (pod.test-pod/local-date-time (java.time.LocalDateTime/now)))
|
||||||
true))
|
true))
|
||||||
|
|
||||||
|
(def assoc-string-array
|
||||||
|
(if (= "transit+json" fmt)
|
||||||
|
(let [v (:a (pod.test-pod/assoc {} :a (into-array String ["foo"])))]
|
||||||
|
(.isArray (class v)))
|
||||||
|
true))
|
||||||
|
|
||||||
(require '[pod.test-pod.only-code :as only-code])
|
(require '[pod.test-pod.only-code :as only-code])
|
||||||
(def should-be-1 (only-code/foo))
|
(def should-be-1 (only-code/foo))
|
||||||
|
|
||||||
|
|
@ -101,4 +107,5 @@
|
||||||
loaded
|
loaded
|
||||||
fn-called
|
fn-called
|
||||||
local-date-time
|
local-date-time
|
||||||
|
assoc-string-array
|
||||||
should-be-1]
|
should-be-1]
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,12 @@
|
||||||
(apply pods/load-pod @ctx-ref args))
|
(apply pods/load-pod @ctx-ref args))
|
||||||
'invoke pods/invoke
|
'invoke pods/invoke
|
||||||
'unload-pod pods/unload-pod
|
'unload-pod pods/unload-pod
|
||||||
'add-transit-read-handler pods/add-transit-read-handler
|
'add-transit-read-handler! pods/add-transit-read-handler!
|
||||||
'add-transit-write-handler pods/add-transit-write-handler}}
|
'add-transit-write-handler! pods/add-transit-write-handler!
|
||||||
|
'set-transit-default-write-handler! pods/set-transit-default-write-handler!}}
|
||||||
:classes {'System System
|
:classes {'System System
|
||||||
'java.time.LocalDateTime java.time.LocalDateTime}})
|
'java.time.LocalDateTime java.time.LocalDateTime
|
||||||
|
'java.lang.Class Class}})
|
||||||
_ (vreset! ctx-ref ctx)
|
_ (vreset! ctx-ref ctx)
|
||||||
ret (sci/binding [sci/out out
|
ret (sci/binding [sci/out out
|
||||||
sci/err err]
|
sci/err err]
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,8 @@
|
||||||
[[1] [1]]
|
[[1] [1]]
|
||||||
2
|
2
|
||||||
3
|
3
|
||||||
true
|
true ;; local-date
|
||||||
|
true ;; roundtrip string array
|
||||||
1]
|
1]
|
||||||
(concat ret (repeat ::nil)))]
|
(concat ret (repeat ::nil)))]
|
||||||
(if (instance? java.util.regex.Pattern expected)
|
(if (instance? java.util.regex.Pattern expected)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue