From df6e6cbb292706e1c185a9d8734ebd7e4e4805f9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 16 May 2021 23:28:45 +0200 Subject: [PATCH] wip --- src/babashka/pods/impl.clj | 18 ++++++++++++++++-- src/babashka/pods/jvm.clj | 6 ++++++ src/babashka/pods/sci.clj | 6 ++++++ test-pod/pod/test_pod.clj | 20 +++++++++++++++++--- test-resources/test_program.clj | 5 +++++ 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/babashka/pods/impl.clj b/src/babashka/pods/impl.clj index 2f4becd..9534a9d 100644 --- a/src/babashka/pods/impl.clj +++ b/src/babashka/pods/impl.clj @@ -39,14 +39,28 @@ (defn next-id [] (str (java.util.UUID/randomUUID))) +(defonce transit-read-handlers (atom {})) + (defn transit-json-read [^String s] (with-open [bais (java.io.ByteArrayInputStream. (.getBytes s "UTF-8"))] - (let [r (transit/reader bais :json)] + (let [r (transit/reader bais :json @transit-read-handlers)] (transit/read r)))) +;; https://www.cognitect.com/blog/2015/9/10/extending-transit +(defn add-transit-read-handler [tag fn] + (let [rh (transit/read-handler fn)] + (swap! transit-read-handlers assoc tag rh))) + +(defonce transit-write-handlers (atom {})) + +;; https://www.cognitect.com/blog/2015/9/10/extending-transit +(defn add-transit-write-handler [class tag fn] + (let [rh (transit/write-handler tag fn)] + (swap! transit-write-handlers assoc class rh))) + (defn transit-json-write [^String s] (with-open [baos (java.io.ByteArrayOutputStream. 4096)] - (let [w (transit/writer baos :json)] + (let [w (transit/writer baos :json {:handlers @transit-write-handlers})] (transit/write w s) (str baos)))) diff --git a/src/babashka/pods/jvm.clj b/src/babashka/pods/jvm.clj index 94aa545..5442369 100644 --- a/src/babashka/pods/jvm.clj +++ b/src/babashka/pods/jvm.clj @@ -69,3 +69,9 @@ (defn invoke ([pod-id sym args] (invoke pod-id sym args {})) ([pod-id sym args opts] (impl/invoke-public pod-id sym args opts))) + +(defn add-transit-read-handler [tag fn] + (impl/add-transit-read-handler tag fn)) + +(defn add-transit-write-handler [class tag fn] + (impl/add-transit-write-handler class tag fn)) diff --git a/src/babashka/pods/sci.clj b/src/babashka/pods/sci.clj index 2b3ae83..a8794b5 100644 --- a/src/babashka/pods/sci.clj +++ b/src/babashka/pods/sci.clj @@ -79,3 +79,9 @@ (defn invoke ([pod-id sym args] (invoke pod-id sym args {})) ([pod-id sym args opts] (impl/invoke-public pod-id sym args opts))) + +(defn add-transit-read-handler [tag fn] + (impl/add-transit-read-handler tag fn)) + +(defn add-transit-write-handler [class tag fn] + (impl/add-transit-write-handler class tag fn)) diff --git a/test-pod/pod/test_pod.clj b/test-pod/pod/test_pod.clj index b269ad1..f004d0a 100644 --- a/test-pod/pod/test_pod.clj +++ b/test-pod/pod/test_pod.clj @@ -36,12 +36,21 @@ (defn transit-json-read [^String s] (with-open [bais (java.io.ByteArrayInputStream. (.getBytes s "UTF-8"))] - (let [r (transit/reader bais :json)] + (let [r (transit/reader bais :json {:handlers + {(str ::local-date-time) + (transit/read-handler + (fn [s] + (java.time.LocalDateTime/parse s)))}})] (transit/read r)))) (defn transit-json-write [^String s] (with-open [baos (java.io.ByteArrayOutputStream. 4096)] - (let [w (transit/writer baos :json)] + (let [w (transit/writer baos :json {:handlers + {java.time.LocalDateTime + (transit/write-handler + (str ::local-date-time) + (fn [s] + (java.time.LocalDateTime/parse s)))}})] (transit/write w s) (str baos)))) @@ -193,7 +202,12 @@ (write out {"status" ["done"] "id" id - "value" "#my/other-tag[1]"})) + "value" "#my/other-tag[1]"}) + pod.test-pod/local-date-time + (write out + {"status" ["done"] + "id" id + "value" (write-fn (java.time.LocalDateTime/now))})) (recur)) :shutdown (System/exit 0) :load-ns (let [ns (-> (get message "ns") diff --git a/test-resources/test_program.clj b/test-resources/test_program.clj index 5f458d8..e1e0641 100644 --- a/test-resources/test_program.clj +++ b/test-resources/test_program.clj @@ -64,6 +64,10 @@ (def fn-called (pod.test-pod/fn-call inc 2)) +(def local-date-time + (when (= "transit+json" fmt) + (pod.test-pod/local-date-time))) + (require '[pod.test-pod.only-code :as only-code]) (def should-be-1 (only-code/foo)) @@ -90,4 +94,5 @@ other-tagged loaded fn-called + local-date-time should-be-1]