mirror of
https://github.com/taoensso/telemere.git
synced 2025-12-16 17:41:12 +00:00
[mod] pr-signal: switch to single (opts) arity only
For consistency with other utils and handlers
This commit is contained in:
parent
e7cce0c12b
commit
1f624b6d50
4 changed files with 40 additions and 29 deletions
|
|
@ -141,7 +141,7 @@
|
|||
;; Create console which writes signals as edn
|
||||
(def my-handler
|
||||
(t/handler:console
|
||||
{:output-fn (t/pr-signal-fn :edn)}))
|
||||
{:output-fn (t/pr-signal-fn {:pr-fn :edn})}))
|
||||
|
||||
(my-handler my-signal) ; =>
|
||||
;; {:inst #inst "2024-04-11T10:54:57.202869Z", :msg_ "My message", :ns "examples", ...}
|
||||
|
|
@ -152,8 +152,9 @@
|
|||
(t/handler:console
|
||||
{:output-fn
|
||||
(t/pr-signal-fn
|
||||
#?(:cljs :json
|
||||
:clj jsonista.core/write-value-as-string))}))
|
||||
{:pr-fn
|
||||
#?(:cljs :json
|
||||
:clj jsonista.core/write-value-as-string)})}))
|
||||
|
||||
(my-handler my-signal) ; =>
|
||||
;; {"inst":"2024-04-11T10:54:57.202869Z","msg_":"My message","ns":"examples", ...}
|
||||
|
|
|
|||
|
|
@ -582,26 +582,27 @@
|
|||
- Returns a machine-readable (minified) signal string.
|
||||
|
||||
Options:
|
||||
`pr-fn` - ∈ #{<unary-fn> :edn :json (Cljs only)}
|
||||
`:pr-fn` - ∈ #{<unary-fn> :edn (default) :json (Cljs only)}
|
||||
`:incl-thread?` - Include signal `:thread` info? (default false)
|
||||
`:incl-kvs?` - Include signal `:kvs` info? (default false)
|
||||
`:incl-newline?` - Include terminating system newline? (default true)
|
||||
|
||||
Examples:
|
||||
(pr-signal-fn :edn {<opts>})
|
||||
(pr-signal-fn :json {<opts>}) ; Cljs only
|
||||
(pr-signal-fn {:pr-fn :edn ...}) ; Outputs edn
|
||||
(pr-signal-fn {:pr-fn :json ...}) ; Outputs JSON (Cljs only)
|
||||
|
||||
To output JSON for Clj, you must provide an appropriate `:pr-fn`.
|
||||
`jsonista` is one good option, Ref. <https://github.com/metosin/jsonista>:
|
||||
|
||||
;; To output JSON for Clj, you must provide an appropriate `pr-fn`.
|
||||
;; `jsonista` is a good option, Ref. <https://github.com/metosin/jsonista>:
|
||||
(require '[jsonista.core :as jsonista])
|
||||
(pr-signal-fn jsonista/write-value-as-string {<opts>})
|
||||
(pr-signal-fn {:pr-fn jsonista/write-value-as-string ...})
|
||||
|
||||
See also `format-signal-fn` for human-readable output."
|
||||
([pr-fn] (pr-signal-fn pr-fn nil))
|
||||
([pr-fn
|
||||
{:keys [incl-thread? incl-kvs? incl-newline?, prep-fn]
|
||||
([] (pr-signal-fn nil))
|
||||
([{:keys [incl-thread? incl-kvs? incl-newline?, pr-fn prep-fn]
|
||||
:or
|
||||
{incl-newline? true
|
||||
pr-fn :edn
|
||||
prep-fn
|
||||
(comp error-in-signal->maps
|
||||
minify-signal)}}]
|
||||
|
|
@ -611,7 +612,12 @@
|
|||
(or
|
||||
(case pr-fn
|
||||
:edn pr-edn
|
||||
#?@(:cljs [:json pr-json])
|
||||
:json
|
||||
#?(:cljs pr-json
|
||||
:clj
|
||||
(throw
|
||||
(ex-info "`:json` pr-fn only supported in Cljs. To output JSON in Clj, please provide an appropriate unary fn instead (e.g. jsonista/write-value-as-string)."
|
||||
{})))
|
||||
|
||||
(if (fn? pr-fn)
|
||||
(do pr-fn)
|
||||
|
|
@ -634,8 +640,8 @@
|
|||
(do output)))))))
|
||||
|
||||
(comment
|
||||
((pr-signal-fn :edn) (tel/with-signal (tel/event! ::ev-id {:kvs {:k1 "v1"}})))
|
||||
((pr-signal-fn (fn [_] "str")) (tel/with-signal (tel/event! ::ev-id {:kvs {:k1 "v1"}}))))
|
||||
((pr-signal-fn {:pr-fn :edn}) (tel/with-signal (tel/event! ::ev-id {:kvs {:k1 "v1"}})))
|
||||
((pr-signal-fn {:pr-fn (fn [_] "str")}) (tel/with-signal (tel/event! ::ev-id {:kvs {:k1 "v1"}}))))
|
||||
|
||||
(defn format-signal-fn
|
||||
"Experimental, subject to change.
|
||||
|
|
|
|||
|
|
@ -690,19 +690,22 @@
|
|||
(let [sig (with-sig (tel/event! ::ev-id {:inst t0}))]
|
||||
|
||||
[(testing ":edn"
|
||||
(let [sig (update sig :inst enc/inst->udt)
|
||||
sig* (enc/read-edn ((tel/pr-signal-fn :edn) sig))]
|
||||
(is
|
||||
(enc/submap? sig*
|
||||
{:schema 1, :kind :event, :id ::ev-id, :level :info,
|
||||
:ns "taoensso.telemere-tests"
|
||||
:inst udt0
|
||||
:line pnat-int?
|
||||
:column pnat-int?}))))
|
||||
(let [sig (update sig :inst enc/inst->udt)
|
||||
sig*1 (enc/read-edn ((tel/pr-signal-fn {:pr-fn :edn}) sig))
|
||||
sig*2 (enc/read-edn ((tel/pr-signal-fn) sig))]
|
||||
|
||||
[(is (= sig*1 sig*2) "Default :pr-fn is :edn")
|
||||
(is
|
||||
(enc/submap? sig*1
|
||||
{:schema 1, :kind :event, :id ::ev-id, :level :info,
|
||||
:ns "taoensso.telemere-tests"
|
||||
:inst udt0
|
||||
:line pnat-int?
|
||||
:column pnat-int?}))]))
|
||||
|
||||
#?(:cljs
|
||||
(testing ":json"
|
||||
(let [sig* (enc/read-json ((tel/pr-signal-fn :json) sig))]
|
||||
(let [sig* (enc/read-json ((tel/pr-signal-fn {:pr-fn :json}) sig))]
|
||||
(is
|
||||
(enc/submap? sig*
|
||||
{"schema" 1, "kind" "event", "id" "taoensso.telemere-tests/ev-id",
|
||||
|
|
@ -712,7 +715,7 @@
|
|||
"column" pnat-int?})))))
|
||||
|
||||
(testing "user fn"
|
||||
(is (= ((tel/pr-signal-fn (fn [_] "str")) sig) (str "str" utils/newline))))]))
|
||||
(is (= ((tel/pr-signal-fn {:pr-fn (fn [_] "str")}) sig) (str "str" utils/newline))))]))
|
||||
|
||||
(testing "format-signal-fn"
|
||||
(let [sig (with-sig (tel/event! ::ev-id {:inst t0}))]
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ To instead writes signals as edn:
|
|||
;; Create console which writes edn
|
||||
(def my-handler
|
||||
(t/handler:console
|
||||
{:output-fn (t/pr-signal-fn :edn)}))
|
||||
{:output-fn (t/pr-signal-fn {:pr-fn :edn})}))
|
||||
|
||||
(my-handler my-signal) ; =>
|
||||
;; {:inst #inst "2024-04-11T10:54:57.202869Z", :msg_ "My message", :ns "examples", ...}
|
||||
|
|
@ -91,8 +91,9 @@ To instead writes signals as JSON:
|
|||
(t/handler:console
|
||||
{:output-fn
|
||||
(t/pr-signal-fn
|
||||
#?(:cljs :json
|
||||
:clj jsonista.core/write-value-as-string))}))
|
||||
{:pr-fn
|
||||
#?(:cljs :json
|
||||
:clj jsonista.core/write-value-as-string)})}))
|
||||
```
|
||||
|
||||
Note that when writing JSON with Clojure, you *must* provide an appropriate `pr-fn`. This lets you plug in the JSON serializer of your choice ([jsonista](https://github.com/metosin/jsonista) is my default recommendation).
|
||||
|
|
|
|||
Loading…
Reference in a new issue