-
Notifications
You must be signed in to change notification settings - Fork 1
/
core.clj
61 lines (54 loc) · 1.7 KB
/
core.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
(ns org.passen.malapropism.core
(:require
[camel-snake-kebab.core :as csk]
[clojure.edn :as edn]
[clojure.java.io :as io]
[clojure.tools.logging :as log]
[malli.core :as m]
[malli.error :as me]
[malli.transform :as mt])
(:import
(java.io PushbackReader)))
(defn with-schema
[config-schema]
[config-schema nil])
(defn with-values-from-map
[[config-schema config-values] m]
(log/infof "Populating, %d values" (count m))
[config-schema (merge config-values m)])
(defn with-values-from-file
[config file]
(log/info "Populating from file")
(with-values-from-map
config
(-> (io/reader file)
(PushbackReader.)
edn/read)))
(defn- environment-variables
[]
(System/getenv))
(defn with-values-from-env
[config]
(log/info "Populating from env")
(with-values-from-map
config
(update-keys (environment-variables) csk/->kebab-case-keyword)))
(defn verify!
[[config-schema config-values] & {:keys [verbose?]}]
(let [transformer (mt/transformer
mt/strip-extra-keys-transformer
mt/default-value-transformer
mt/string-transformer)
transformed-values (m/decode config-schema config-values transformer)]
(if (m/validate config-schema transformed-values)
transformed-values
(let [explanation (m/explain config-schema transformed-values)]
(throw
(ex-info
"Config values do not match schema!"
(cond->
{:humanized (me/humanize explanation)
:schema config-schema}
verbose?
(assoc :errors (:errors explanation)
:values config-values))))))))