[new] Add (conditional) :do support to signals

This commit is contained in:
Peter Taoussanis 2024-03-06 14:42:42 +01:00
parent 722c6abb67
commit ab00cb4f64
2 changed files with 34 additions and 38 deletions

View file

@ -315,7 +315,7 @@
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? location instant uid middleware,
sample-rate ns kind id level filter when rate-limit,
ctx parent trace?, let data msg error run & user-opts]}])
ctx parent trace?, do let data msg error run & user-opts]}])
:log! ; [msg] [level-or-opts msg] => <allowed?>
'([ msg]
@ -324,7 +324,7 @@
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? location instant uid middleware,
sample-rate ns kind id level filter when rate-limit,
ctx parent trace?, let data msg error #_run & user-opts]}
ctx parent trace?, do let data msg error #_run & user-opts]}
msg])
:event! ; [id] [level-or-opts id] => <allowed?>
@ -334,7 +334,7 @@
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? location instant uid middleware,
sample-rate ns kind id level filter when rate-limit,
ctx parent trace?, let data msg error #_run & user-opts]}
ctx parent trace?, do let data msg error #_run & user-opts]}
id])
:error! ; [error] [id-or-opts error] => <error>
@ -344,7 +344,7 @@
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? location instant uid middleware,
sample-rate ns kind id level filter when rate-limit,
ctx parent trace?, let data msg error #_run & user-opts]}
ctx parent trace?, do let data msg error #_run & user-opts]}
error])
(:trace! :spy!) ; [form] [id-or-opts form] => <run result> (value or throw)
@ -354,7 +354,7 @@
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? location instant uid middleware,
sample-rate ns kind id level filter when rate-limit,
ctx parent trace?, let data msg error run & user-opts]}
ctx parent trace?, do let data msg error run & user-opts]}
form])
:catch->error! ; [form] [level-or-opts form] => <run result> (value or throw)
@ -364,7 +364,7 @@
[#_defaults #_elide? #_allow? #_callsite-id, rethrow? catch-val,
elidable? location instant uid middleware,
sample-rate ns kind id level filter when rate-limit,
ctx parent trace?, let data msg error #_run & user-opts]}
ctx parent trace?, do let data msg error #_run & user-opts]}
form])
:uncaught->error! ; [] [id-or-opts] => nil
@ -374,7 +374,7 @@
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? location instant uid middleware,
sample-rate ns kind id level filter when rate-limit,
ctx parent trace?, let data msg error #_run & user-opts]}])
ctx parent trace?, do let data msg error #_run & user-opts]}])
(enc/unexpected-arg! macro-id))))
@ -452,38 +452,34 @@
(catch :any ~'__t (RunResult. nil ~'__t (- (enc/now-nano*) ~'__t0)))))))
signal-form
(let [{let-form :let
(let [{do-form :do
let-form :let
data-form :data
msg-form :msg
error-form :error
sample-rate-form :sample-rate}
opts
let-form (or let-form '[])
msg-form (parse-msg-form msg-form)
;; No, better leave it to user re: whether or not to delay-wrap
;; data-form
;; (when data-form
;; (if (enc/call-in-form? data-form)
;; `(delay ~data-form)
;; (do data-form)))
let-form (or let-form '[])
msg-form (parse-msg-form msg-form)
user-opts-form
(not-empty
(dissoc opts
:elidable? :location :instant :uid :middleware,
:sample-rate :ns :kind :id :level :filter :when #_:rate-limit,
:ctx :parent #_:trace?, :let :data :msg :error :run
:ctx :parent #_:trace?, :do :let :data :msg :error :run
:elide? :allow? :callsite-id))]
;; Eval let bindings AFTER call filtering but BEFORE data, msg
`(let ~let-form ; Allow to throw during `signal-value_` deref
(new-signal ~'__instant ~'__uid
~callsite-id ~location ~ns ~line ~column ~file,
~sample-rate-form, ~kind-form ~'__id ~level-form, ~ctx-form ~parent-form,
~user-opts-form ~data-form ~msg-form,
'~run-form ~'__run-result ~error-form)))]
`(do
~do-form
(let ~let-form ; Allow to throw during `signal-value_` deref
(new-signal ~'__instant ~'__uid
~callsite-id ~location ~ns ~line ~column ~file,
~sample-rate-form, ~kind-form ~'__id ~level-form, ~ctx-form ~parent-form,
~user-opts-form ~data-form ~msg-form,
'~run-form ~'__run-result ~error-form))))]
#_ ; Sacrifice some perf to de-dupe (possibly large) `run-form`
(let [~'__run-fn ~run-fn-form]

View file

@ -163,24 +163,24 @@
(is (= rv5 9)) (is (= (:msg_ sv5) nil))
(is (= @c 12) "5x run + 4x let (1x suppressed) + 3x msg (1x suppressed)")]))
(testing "`:let` + `:data`"
(testing "`:do` + `:let` + `:data`/`:my-opt`"
(vec
(for [dk [:data :my-opt]]
(let [c (enc/counter)
[rv1 sv1] (ws (sig! {:level :info, :run (c), :let [n (c)], dk {:n n, :c1 (c)}}))
[rv2 sv2] (ws (sig! {:level :info, :run (c), :let [n (c)], dk (delay {:n n, :c2 (c)})}))
[rv3 sv3] (ws (sig! {:level :info, :run (c), :let [n (c)], dk {:n n, :c3 (c)}, :allow? false}))
[rv4 sv4] (ws (sig! {:level :info, :run (c), :let [n (c)], dk (delay {:n n, :c4 (c)}), :allow? false}))
[rv5 sv5] (ws (sig! {:level :info, :run (c), :let [n (c)], dk [:n n, :c5 (c)]}))
[rv6 sv6] (ws (sig! {:level :info, :run (c), :let [n (c)], dk (delay [:n n, :c6 (c)])}))]
[rv1 sv1] (ws (sig! {:level :info, :run (c), :do (c), :let [n (c)], dk {:n n, :c1 (c)}}))
[rv2 sv2] (ws (sig! {:level :info, :run (c), :do (c), :let [n (c)], dk (delay {:n n, :c2 (c)})}))
[rv3 sv3] (ws (sig! {:level :info, :run (c), :do (c), :let [n (c)], dk {:n n, :c3 (c)}, :allow? false}))
[rv4 sv4] (ws (sig! {:level :info, :run (c), :do (c), :let [n (c)], dk (delay {:n n, :c4 (c)}), :allow? false}))
[rv5 sv5] (ws (sig! {:level :info, :run (c), :do (c), :let [n (c)], dk [:n n, :c5 (c)]}))
[rv6 sv6] (ws (sig! {:level :info, :run (c), :do (c), :let [n (c)], dk (delay [:n n, :c6 (c)])}))]
[(is (= rv1 0)) (is (= (get sv1 dk) {:n 1, :c1 2}))
(is (= rv2 3)) (is (= (force (get sv2 dk)) {:n 4, :c2 12}))
(is (= rv3 5)) (is (= (get sv3 dk) nil))
(is (= rv4 6)) (is (= (force (get sv4 dk)) nil))
(is (= rv5 7)) (is (= (get sv5 dk) [:n 8, :c5 9]))
(is (= rv6 10)) (is (= (force (get sv6 dk)) [:n 11, :c6 13]))
(is (= @c 14) "6x run + 4x let (2x suppressed) + 4x data (2x suppressed)")]))))
[(is (= rv1 0)) (is (= (get sv1 dk) {:n 2, :c1 3}))
(is (= rv2 4)) (is (= (force (get sv2 dk)) {:n 6, :c2 16}))
(is (= rv3 7)) (is (= (get sv3 dk) nil))
(is (= rv4 8)) (is (= (force (get sv4 dk)) nil))
(is (= rv5 9)) (is (= (get sv5 dk) [:n 11, :c5 12]))
(is (= rv6 13)) (is (= (force (get sv6 dk)) [:n 15, :c6 17]))
(is (= @c 18) "6x run + 4x do (2x suppressed) + 4x let (2x suppressed) + 4x data (2x suppressed)")]))))
(testing "Manual `let` (unconditional) + `:data`/`:my-opt`"
(vec