Использование Prismatic/ схемы для проверки формы с помощью Liberator
Является ли Prismatic / схема подходящим для проверки формы? Я никогда не проектировал lib для валидации форм, но я представляю, что он выводит что-то вроде этого, а не создает исключения на s/validate
:
{::errors {:name [{:missing "Required field."}
{:length "Must be at least 3 characters."}]
:email [{:email "Must be a valid email address"}]}}
Я надеюсь, что кто-то использовал его с Compojure и Liberator, но я ничего не могу найти в Интернете.
3 ответа
Нашел на GitHub отличных помощников в Dante, но лицензия на использование не ясна:
(ns dante.tools.schemas
(:require [dante.tools.namespaces :refer [export]]
[schema.core :as s]
[schema.coerce :as coerce]
[schema.utils :refer [validation-error-explain]])
(:import [schema.utils NamedError ValidationError]))
(defn explain [errors]
(cond
(map? errors)
(->> errors
(map (fn [[k v]]
[k (explain v)]))
(into {}))
(or (seq? errors)
(coll? errors))
(map explain errors)
(instance? NamedError errors)
[(.name errors)
(explain (.error errors))]
(instance? ValidationError errors)
(str (validation-error-explain errors))
:else
(str errors)))
(defn- coercercions [schema]
(or
(coerce/+string-coercions+ schema)
(coerce/set-matcher schema)))
(defn validate [schema value]
((coerce/coercer schema coercercions) value))
Я уже давно использую схему для проверки общей формы (ClojureScript) и на стороне сервера (Clojure), и это получилось очень хорошо.
Первоначально я опубликовал предложение по использованию схемы таким образом на GitHub:
Дайте мне знать, если вам нужны дополнительные примеры.
Из вашего описания карты ошибок, которую вы хотите в случае ошибки проверки, похоже, что Validateur подойдет. Цитирование на странице "Начало работы":
Validateur - это библиотека валидации, вдохновленная ActiveModel Руби. Validateur является функциональным: валидаторы являются функциями, наборы валидации являются функциями высшего порядка, результаты валидации возвращаются в виде значений.
Вокруг этого небольшого ядра Validateur можно расширить любым пользовательским валидатором, который вам может понадобиться: это так же просто, как определить функцию Clojure, которая соответствует простому контракту.