-
Notifications
You must be signed in to change notification settings - Fork 5
/
validations.clj
71 lines (59 loc) · 2.35 KB
/
validations.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
(ns vlad.validations
(:use [vlad.validation-types])
(:require [clojure.string :as str]))
(defn present
"Checks that the string found at `selector` is not blank.
Example:
(validate (present :name)
{:name \"Vlad\"})"
[selector]
(predicate selector str/blank? {:type ::present}))
(defn length-over
"Checks that the `count` of the value found at `selector` is over `size`."
[size selector]
(predicate selector #(> size (count %)) {:type ::length-over :size size}))
(defn length-under
"Checks that the `count` of the value found at `selector` is under `size`."
[size selector]
(predicate selector #(< size (count %)) {:type ::length-under :size size}))
(defn length-in
"Checks that the `count` of the value found at `selector` is over `lower` and
under `upper`. No checking is done that `lower` is lower than `upper`. This
validator may return multiple errors"
[lower upper selector]
(join
(length-over lower selector)
(length-under upper selector)))
(defn one-of
"Checks that the value found at `selector` is found within `set`"
[set selector]
(predicate selector #(not (contains? set %)) {:type ::one-of :set set}))
(defn not-of
"Checks that the value found at `selector` is not found within `set`"
[set selector]
(predicate selector #(contains? set %) {:type ::not-of :set set}))
(defn equals-value
"Checks that the value found at `selector` is equal to the `value` that you
provide."
[value selector]
(predicate selector #(not (= value %)) {:type ::equals-value :value value}))
(defn equals-field
"Checks that the values found at each of your selectors are equal to each
other"
[first-selector second-selector]
(fn [data]
(let [first-value (get-in data first-selector)
second-value (get-in data second-selector)]
(if (= first-value second-value)
[]
[{:type ::equals-field
:first-selector first-selector
:second-selector second-selector}]))))
(defn matches
"Checks that the value found at `selector` is a regex match for `pattern`.
This uses clojure's `re-matches` function which may not behave as you expect.
Your pattern will have to match the whole string found at `selector` to count
as a match."
[pattern selector]
(predicate selector #(nil? (re-matches pattern %))
{:type ::matches :pattern pattern}))