/
check.clj
46 lines (38 loc) · 1.48 KB
/
check.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
(ns envoy.check
(:require
[clojure.tools.logging :as log]
[clojure.string :as str]))
(def behavior-types
"Set of valid values for behavior types."
#{nil :warn :abort})
(def behaviors
"Definition for how the library should behave in various situations."
{:undeclared-access :warn
:undeclared-override :warn
:undeclared-config :abort})
(defn set-behavior!
"Set the behavior of the library in various situations."
[& {:as settings}]
(when-let [bad-settings (seq (remove (set (keys behaviors)) (keys settings)))]
(throw (IllegalArgumentException.
(str "Invalid behavior settings: " (str/join " " (map pr-str bad-settings))))))
(when-let [bad-types (seq (remove (partial contains? behavior-types) (vals settings)))]
(throw (IllegalArgumentException.
(str "Invalid behavior types: " (str/join " " (map pr-str bad-types))))))
(alter-var-root #'behaviors merge settings))
(defn behave!
"Standard function for interpreting behavior settings."
([behavior message var-key]
(behave!
behavior
(behaviors behavior)
message
var-key))
([behavior setting message var-key & format-args]
(case setting
nil nil
:warn (log/warn (apply format message (str var-key) format-args))
:abort (throw (ex-info (apply format message (str var-key) format-args)
{:type behavior, :var var-key}))
(log/errorf "Unknown behavior type for %s %s"
behavior (pr-str setting)))))