From 0acd7a17884bfa7d59a404fbc6de268de028f73f Mon Sep 17 00:00:00 2001 From: Jude Payne Date: Wed, 3 May 2023 22:38:41 +0100 Subject: [PATCH] opt-in metadata sketch --- src/babashka/pods/impl.clj | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/babashka/pods/impl.clj b/src/babashka/pods/impl.clj index b2b14e2..18836c7 100644 --- a/src/babashka/pods/impl.clj +++ b/src/babashka/pods/impl.clj @@ -28,6 +28,9 @@ (defn bytes->string [^"[B" bytes] (String. bytes)) +(defn bytes->boolean [^"[B" bytes] + (boolean bytes)) + (defn get-string [m k] (-> (get m k) bytes->string)) @@ -36,6 +39,10 @@ (some-> (get m k) bytes->string)) +(defn get-maybe-boolean [m k] + (some-> (get m k) + bytes->boolean)) + (defn next-id [] (str (java.util.UUID/randomUUID))) @@ -83,12 +90,16 @@ (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] - (with-open [baos (java.io.ByteArrayOutputStream. 4096)] - (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) - (str baos)))) +(defonce vars-with-metadata-on-args (atom {})) + +(defn transit-json-write + ([pod-id ^String s metadata-on-args?] + (with-open [baos (java.io.ByteArrayOutputStream. 4096)] + (let [w (transit/writer baos :json (merge {:handlers (get @transit-write-handler-maps pod-id) + :default-handler (get @transit-default-write-handlers pod-id)} + (when metadata-on-args? {:transform transit/write-meta})))] + (transit/write w s) + (str baos))))) (defn invoke [pod pod-var args opts] (let [handlers (:handlers opts) @@ -98,7 +109,9 @@ write-fn (case format :edn pr-str :json cheshire/generate-string - :transit+json #(transit-json-write (:pod-id pod) %)) + :transit+json #(transit-json-write + (:pod-id pod) % + (some #{pod-var} (get @vars-with-metadata-on-args (:pod-id pod))))) id (next-id) chan (if handlers handlers (promise)) @@ -128,7 +141,10 @@ edn/read-string) name-sym (if vmeta (with-meta name-sym vmeta) - name-sym)] + name-sym) + meta-args? (get-maybe-boolean var "metadata?")] + (when meta-args? + (swap! vars-with-metadata-on-args update (:pod-id pod) conj sym)) [name-sym (or code (fn [& args]