env-config-with-validation
Clojure
(require '[clojure.string :as str])
(defn env
"Reads env var k, falling back to default and applying an optional validator."
([k] (env k nil nil))
([k default] (env k default nil))
([k default valid?]
(let [raw (System/getenv k)
v (if (str/blank? raw) default raw)]
(when (nil? v)
(throw (ex-info (str "Missing required env var " k) {:var k})))
(when (and valid? (not (valid? v)))
(throw (ex-info (str "Invalid value for " k) {:var k :value v})))
v)))
(def port (env "PORT" "8080" #(when-let [n (parse-long %)] (<= 1 n 65535))))