I'm trying to write a macro to conditionally wrap compojure
handler in a middleware only in certain environments. I seem to be lost in the evaluation order and what/how should I quote. My current attempt is as follows:
(defn empty-middleware [handler]
(fn [request] (handler request)))
(defmacro prod [handler middleware]
(if (= "production" (System/getenv "APP_ENV"))
(middleware handler)
(empty-middleware handler)))
Desired usage is:
(in/prod (fn [handler] (airbrake/wrap-airbrake handler config/airbrake-api-key)))
--- EDIT ---
Some more information: in/prod is supposed to be used inside threading macro that wraps routes in a number of middlewares like:
(-> handler
middleware1
middleware2
(in/prod (middleware3 middleware-3-param1))
both middleware3 and in/prod need handler as parameter. Wrapping middleware3 in parenthesis evaluates without possibility to pass handler as a parameter. Hence I thought a macro is needed. I worked out how to make in/prod a function passing middleware3 and middleware params as parameters:
(defn prod [handler middleware & middleware-params]
(if (= "production" (System/getenv "APP_ENV"))
(apply middleware handler middleware-params)
handler))
It changes the syntax a bit though. The call looks like:
(-> handler
middleware1
middleware2
(in/prod middleware3 middleware-3-param1)
How would I go around to being able to use syntax like:
(in/prod (middleware3 middleware-3-param1)