-
Notifications
You must be signed in to change notification settings - Fork 1
/
parameters.clj
50 lines (43 loc) · 1.31 KB
/
parameters.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
(ns configurati.parameters
(:require
[clojure.spec.alpha :as spec]
[configurati.conversions :refer [convert-to]]))
(defn- invalid-reason [parameter value]
(when-let [validator (:validator parameter)]
(spec/explain-data validator value)))
(defn- invalid? [parameter value]
(if-let [validator (:validator parameter)]
(not (spec/valid? validator value))
false))
(defn- missing? [parameter value]
(and
(nil? value)
(not (:nilable parameter))))
(defprotocol Processable
(check [parameter value])
(default [parameter value])
(convert [parameter value])
(validate [parameter value]))
(defrecord ConfigurationParameter
[name nilable default type validator]
Processable
(check [this value]
(cond
(missing? this value) {:error :missing
:value value}
:else {:error nil
:value value}))
(default [_ value]
(if (nil? value) default value))
(convert [_ value]
(try
{:error nil :value (convert-to type value)}
(catch Exception _
{:error :unconvertible :value nil})))
(validate [this value]
(cond
(invalid? this value) {:error :invalid
:value value
:reason (invalid-reason this value)}
:else {:error nil
:value value})))