2015-12-11 61 views
1

我試圖使用棱柱型模式來強制地圖(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}} 

看起來好像匹配器一到達地圖就炸燬了?

回答

3

模式首先將您的地圖分成符合模式的部分,然後將每個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})