/
readme.clj
73 lines (56 loc) · 1.95 KB
/
readme.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
(ns vlad.test.readme
(:require [vlad :refer :all]
[midje.sweet :refer [fact]]))
; Basics
(def validation
(present [:age]))
(def data
{:name "Logan Campbell"})
(fact (validate validation data)
=> [{:type :vlad.validations/present
:selector [:age]}])
; Composition
(def common
(join (present [:name])
(present [:email])))
(def password
(chain (present [:password])
(join (length-in 6 128 [:password])
(matches #"[a-zA-Z]" [:password])
(matches #"[0-9]" [:password]))
(equals-field [:password] [:confirmation])))
(def signup
(join common password))
(def update
common)
(fact (validate signup {:name "Logan Campbell"})
=> '({:selector [:email], :type :vlad.validations/present}
{:selector [:password], :type :vlad.validations/present}))
; Translation
(def english-field-names
{[:name] "Full Name"
[:email] "Email Address"
[:password] "Password"
[:confirmation] "Password Confirmation"})
(fact (-> (validate signup {:password "!"})
(assign-name english-field-names)
(translate-errors english-translation))
=> {[:password] ["Password must be over 6 characters long."
"Password must match the pattern [a-zA-Z]."
"Password must match the pattern [0-9]."],
[:email] ["Email Address is required."],
[:name] ["Full Name is required."]})
(def chinese-field-names
{[:name] "姓名"
[:email] "邮箱"
[:password] "密码"
[:confirmation] "确认密码"})
(defmulti chinese-translation :type)
(defmethod chinese-translation :vlad.validations/present
[{:keys [name]}]
(format "请输入%s" name))
; Other validation translations go here.
(fact (-> (validate update {:name "Rich"})
(assign-name chinese-field-names)
(translate-errors chinese-translation))
=> {[:email] ["请输入邮箱"]})