Skip to content

Commit 679ca77

Browse files
committed
fix key-transformer
1 parent 4cf197b commit 679ca77

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

src/malli/transform.cljc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,16 +303,16 @@
303303
:encoders {:map transform}}))))
304304

305305
(defn key-transformer [{:keys [decode encode]}]
306-
(let [transform (fn [f]
307-
(if f {:leave (fn [x]
306+
(let [transform (fn [f stage]
307+
(if f {stage (fn [x]
308308
(if (map? x)
309309
(reduce-kv
310310
(fn [m k v] (assoc m (f k) v))
311311
(empty x) x)
312312
x))}))]
313313
(transformer
314-
{:decoders {:map (transform decode)}
315-
:encoders {:map (transform encode)}})))
314+
{:decoders {:map (transform decode :enter)}
315+
:encoders {:map (transform encode :leave)}})))
316316

317317
(defn default-value-transformer []
318318
(let [get-default (fn [schema] (some-> schema m/properties :default))

test/malli/transform_test.cljc

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -232,19 +232,19 @@
232232
(is (= {:x "kikka"} (m/encode [:map [:x keyword?]] {:x :kikka, :y :kukka} strict-json-transformer)))))
233233

234234
(let [transformer (mt/transformer
235-
mt/string-transformer
236-
mt/strip-extra-keys-transformer
237235
(mt/key-transformer
238-
{:decode #(-> % name (str "_key") keyword)
239-
:encode #(-> % name (str "_key"))}))]
236+
{:decode #(-> % (subs 4) keyword)
237+
:encode #(->> % name (str "key_"))})
238+
(mt/string-transformer)
239+
(mt/strip-extra-keys-transformer))]
240240
(testing "decode"
241-
(is (= {:x_key 18 :y_key "john"}
241+
(is (= {:x 18 :y "john"}
242242
(m/decode
243243
[:map [:x int?] [:y string?] [[:opt :z] boolean?]]
244-
{:x "18" :y "john" :a "doe"}
244+
{"key_x" "18" "key_y" "john" "key_a" "doe"}
245245
transformer))))
246246
(testing "encode"
247-
(is (= {"x_key" "18" "y_key" "john"}
247+
(is (= {"key_x" "18" "key_y" "john"}
248248
(m/encode
249249
[:map [:x int?] [:y string?] [[:opt :z] boolean?]]
250250
{:x 18 :y "john" :a "doe"}
@@ -283,7 +283,20 @@
283283
(is (= {"x_key" 18 "y_key" "john" "a_key" "doe"}
284284
(m/encode [:map [:x int?] [:y string?] [[:opt :z] boolean?]]
285285
{:x 18 :y "john" :a "doe"}
286-
key-transformer))))))
286+
key-transformer)))))
287+
288+
(testing "from strings and back"
289+
(let [schema [:map
290+
[:id :string]
291+
[:github-followers pos-int?]]
292+
transformer (mt/transformer
293+
(mt/key-transformer {:decode keyword, :encode name})
294+
(mt/string-transformer))
295+
value {"id" "123", "github-followers" "10"}]
296+
(is (= {:id "123", :github-followers 10}
297+
(as-> value $ (m/decode schema $ transformer))))
298+
(is (= value
299+
(as-> value $ (m/decode schema $ transformer) (m/encode schema $ transformer)))))))
287300

288301
(deftest interceptor-style-transformers
289302
(testing "map"

0 commit comments

Comments
 (0)