JSON API Handlers

json-api-transformer is a request/response preset for JSON API-style data. It strips undeclared map keys, decodes JSON-friendly scalar representations, decodes time values, and coerces collection shapes.

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

(def user-schema
  [:map {:closed true}
   [:id :uuid]
   [:name [:string {:min 1}]]
   [:roles [:set :keyword]]])

(def decoded
  (b/decode user-schema
            {:id "550e8400-e29b-41d4-a716-446655440000"
             :name "Ada"
             :roles ["admin" "user"]
             :ignored "dropped"}
            (bt/json-api-transformer)))

(if (b/validate user-schema decoded)
  {:status 200 :body decoded}
  {:status 400 :errors (be/humanize (b/explain user-schema decoded))})

Run the complete example with:

basilisp run examples/json_api_handler.lpy