我试图使用棱镜架构(1.0.4)
来强制映射我试图强迫
{:a 1}
到
{:b 1}
使用带有架构的自定义匹配器:
{:b s/Int}
但是这段代码不起作用:
(require '[schema.core :as s])
(require '[schema.coerce :as coerce])
((coerce/coercer {:b s/Int}
(fn [s]
(when (= s s/Keyword)
(fn [x]
(if (= x :a)
:b
x)))))
{:a 1})
输出:
#schema.utils.ErrorContainer{:error {:b missing-required-key, :a disallowed-key}}
我尝试通过运行以下代码来调试它,该代码匹配架构中的所有内容并输出当前匹配的值和架构:
((coerce/coercer {:b s/Int}
(fn [s]
(when true
(fn [x]
(println s x)
x))))
{:a 1})
输出:
{:b Int} {:a 1}
=>
#schema.utils.ErrorContainer{:error {:b missing-required-key, :a disallowed-key}}
看起来好像匹配器一到地图就会轰炸出来?
答案 0 :(得分:3)
Schema首先将您的地图分成与模式匹配的部分,然后将每个MapEntry强制转换为相应的MapEntry模式,依此类推。在您的情况下,此故障会失败,因此您永远无法获得密钥。
要完成您想要的任务,您必须将强制附加到地图架构并使用例如你的强制职能clojure.set/rename-keys
:
(def Foo {:b s/Int})
((coerce/coercer
Foo
(fn [s]
(when (= s Foo)
#(clojure.set/rename-keys % {:a :b}))))
{:a 1})