棱柱架构强制 - 重命名映射键

时间:2015-12-11 23:57:00

标签: clojure plumatic-schema

我试图使用棱镜架构(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}}

看起来好像匹配器一到地图就会轰炸出来?

1 个答案:

答案 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})