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))))