Validation and Errors

(require '[balli.core :as b])
(require '[balli.error :as be])

(def schema [:map [:id :int] [:name [:string {:min 1}]]])

(b/validate schema {:id 1 :name "Ada"})
;; => true

(be/humanize (b/explain schema {:id "1" :name ""}))
;; => {:id ["should be an integer"], :name ["should be at least 1 characters"]}

(be/humanize (b/explain schema {:id "1" :name ""})
             {:format-message (fn [msg error _opts]
                                (str (name (:type error)) ": " msg))})
;; => {:id ["invalid-type: should be an integer"],
;;     :name ["limits: should be at least 1 characters"]}

Use b/assert-valid at boundaries where invalid data should throw.