This guide will help you add Vase to an existing Pedestal project. Vase creates pedestal routes based on an application description. These routes can be concatenated to your application's routes.
After reading this guide, you will be able to:
The guide assumes you created your Pedestal project with the template:
lein new pedestal-service my-new-service
In your project.clj
, add the Vase dependency information:
:dependencies [,,,
[com.cognitect/pedestal.vase "0.9.0-SNAPSHOT"]
,,,
]
service.clj
service.clj
ns declaration(ns my-new-service.service
(:require ;...
[com.cognitect.vase]))
(def service-map
{:env :prod
,,,
;; Add these lines
::route-set routes
::vase/api-root "/api"
::vase/spec-resources ["vase-api-descriptor.edn"]
,,,
}
If you want more than one descriptor file, just add their names to the
::vase/spec-resources
vector.
server.clj
Add this function to register specs and transact schema:
(defn activate-vase
([base-routes api-root spec-paths]
(activate-vase base-routes api-root spec-paths vase/load-edn-resource))
([base-routes api-root spec-paths vase-load-fn]
(let [vase-specs (mapv vase-load-fn spec-paths)]
(when (seq vase-specs)
(vase/ensure-schema vase-specs)
(vase/specs vase-specs))
{::routes (if (empty? vase-specs)
base-routes
(into base-routes (vase/routes api-root vase-specs)))
::specs vase-specs})))
Add this function to update a Pedestal service map with Vase info:
(defn vase-service
"Optionally given a default service map and any number of string paths
to Vase API Specifications,
Return a Pedestal Service Map with all Vase APIs parsed, ensured, and activated."
([]
(vase-service service/service))
([service-map]
(vase-service service-map vase/load-edn-resource))
([service-map vase-load-fn]
(merge {:env :prod
::server/routes (::routes (activate-vase
(::service/route-set service-map)
(::vase/api-root service-map)
(::vase/spec-resources service-map)
vase-load-fn))}
service-map)))
Update run-dev
to account for loading resources from the filesystem instead of the classpath:
(defn run-dev
"The entry-point for 'lein run-dev'"
[& args]
(println "\nCreating your [DEV] server...")
(-> service/service ;; start with production configuration
(merge {:env :dev
;; do not block thread that starts web server
::server/join? false
;; Routes can be a function that resolve routes,
;; we can use this to set the routes to be reloadable
::server/routes #(route/expand-routes
(::routes (activate-vase (deref #'service/routes)
(::vase/api-root service/service)
(mapv (fn [res-str]
(str "resources/" res-str))
(::vase/spec-resources service/service))
vase/load-edn-file)))
;; all origins are allowed in dev mode
::server/allowed-origins {:creds true :allowed-origins (constantly true)}})
;; Wire up interceptor chains
server/default-interceptors
server/dev-interceptors
server/create-server
server/start))
Your Pedestal application is now Vase-enabled. You can now start
populating resources/vase-api-descriptor.edn
(or whatever you choose
to call it) with your API definition.
You've seen how to:
The next step is to begin defining APIs
Can you improve this documentation?Edit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close