prismatic/schema 的默认值强制而不是错误消息
Default values for prismatic/schema coerce instead of error messages
使用prismatic/schema强制是否可以在强制失败时使用默认值而不是错误消息。
我在 csv 文件中有一个值,该值可能为空 (nil) 或 s/Int。目前使用以下代码我得到了空白:
#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")))
1。你得到的错误不是强制错误,而是验证错误。值必须符合初始架构。
2。要修复它,您需要松开可能为 nil
的字段的模式。假设它是第二个字段:
(def answers-field-schemas [s/Int (s/maybe s/Int) ...])
此时您将得到 nil
s 而不是 nil
字段的错误:
user> (answers-coerce-fields ["1" nil])
[1 nil]
3。如果你真的想要默认值而不是强制后的 nil
s,你将需要自定义强制匹配器。像这样:
(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))))
同时修改之前的coercer如下:
(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
的默认值
使用prismatic/schema强制是否可以在强制失败时使用默认值而不是错误消息。
我在 csv 文件中有一个值,该值可能为空 (nil) 或 s/Int。目前使用以下代码我得到了空白:
#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")))
1。你得到的错误不是强制错误,而是验证错误。值必须符合初始架构。
2。要修复它,您需要松开可能为 nil
的字段的模式。假设它是第二个字段:
(def answers-field-schemas [s/Int (s/maybe s/Int) ...])
此时您将得到 nil
s 而不是 nil
字段的错误:
user> (answers-coerce-fields ["1" nil])
[1 nil]
3。如果你真的想要默认值而不是强制后的 nil
s,你将需要自定义强制匹配器。像这样:
(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))))
同时修改之前的coercer如下:
(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
的默认值