Coercion and Transforms

(require '[balli.core :as b])
(require '[balli.transform :as bt])

(def schema [:map [:age :int] [:tags [:set :keyword]]])

(b/decode schema
          {:age "42" :tags ["a" "b"]}
          (bt/string-transformer))
;; => {:age 42 :tags #{:a :b}}

Compose transformers when data crosses multiple representation boundaries.

(bt/transformer (bt/json-transformer)
                (bt/time-transformer)
                (bt/string-transformer))

For common boundaries, use the named presets:

(bt/env-transformer)          ;; environment/CLI config maps
(bt/query-params-transformer) ;; query/form parameter maps
(bt/json-api-transformer)     ;; JSON API request/response bodies