2016-04-25 16 views
1

プリズム/スキーマ強制を使用すると、エラーメッセージの代わりに強制変換が失敗したときにデフォルト値を持つことができます。エラーメッセージの代わりにプリズム/スキーマ強制のデフォルト値

私は空白(nil)またはs/Intの値を持つcsvファイルに値を持っています。以下のコードで、現時点では私は空白のためにこれを取得:

#schema.utils.ErrorContainer{:error (not (integer? nil))} 

コード:

(def answers (slurp "excel/answers.csv")) 
(def answers-field-schemas [s/Int s/Int s/Str s/Str s/Str s/Int s/Str s/Int s/Str s/Int s/Str s/Int s/Str s/Int s/Str]) 

(def answers-field-coercers 
    (mapv coerce/coercer 
    answers-field-schemas 
    (repeat coerce/string-coercion-matcher))) 

(defn answers-coerce-fields [fields] 
    (mapv #(%1 %2) answers-field-coercers fields)) 

(def answers->data (map answers-coerce-fields (csv/parse-csv answers :end-of-line "\r"))) 

答えて

3

1。取得したエラーは、強制エラーではなく、検証エラーです。値は初期スキーマに準拠する必要があります。

2。これを修正するには、nilのフィールドのスキーマを失う必要があります。のは、それが2番目のフィールドだとしましょう:

(def answers-field-schemas [s/Int (s/maybe s/Int) ...]) 

この時点で、あなたの代わりにnilフィールドのエラーのnil秒を取得します:

user> (answers-coerce-fields ["1" nil]) 
[1 nil] 

3。強制後に実際にnilの代わりにデフォルト値が必要な場合は、カスタム強制変換マッチャーが必要です。このような何か:次のように

(import 'schema.core.Maybe) 

(defn field-matcher-with-default [default] 
    (fn [s] 
    (let [string-coercion-fn (or (coerce/string-coercion-matcher s) 
           identity) 
      maybe-coercion-fn (if (instance? schema.core.Maybe s) 
           (fnil identity default) 
           identity)] 
     (comp 
     string-coercion-fn 
     maybe-coercion-fn)))) 

はまた、以前のコウアーサーを変更します。その後、

(def answers-field-coercers 
    (mapv coerce/coercer 
     answers-field-schemas 
     ;; your default here 
     (repeat (field-matcher-with-default -1)))) 

と:それはすることはできませんので、デフォルト値は、同様のスキーマに準拠しなければならないこと

user> (answers-coerce-fields ["1" nil]) 
[1 -1] 

注意スキーマ(s/maybe s/Int)のタイプStringのデフォルト値を設定します。

関連する問題