-
Notifications
You must be signed in to change notification settings - Fork 0
/
routes.clj
27 lines (26 loc) · 1.47 KB
/
routes.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(ns me.lsund.routes
(:require [clojure.edn :as edn]
[me.lsund.util :refer [select-keys-with-nil]]
[compojure.core :as compojure]))
(defmacro generate-routes [routes-spec & xs#]
(let [route-spec# (if (string? routes-spec)
(edn/read-string (slurp routes-spec))
@(ns-resolve *ns* routes-spec))]
`(compojure/routes
~@(for [[method path args & body] xs#]
(case method
get-route `(compojure/GET ~(if (keyword path)
(get (:get route-spec#) path)
(get-in (:get route-spec#) path))
request-map#
(do
((fn [{:keys ~args}] ~@body)
(select-keys-with-nil (:params request-map#)
~(mapv keyword args)))))
post-route `(compojure/POST ~(if (keyword path)
(get (:post route-spec#) path)
(get-in (:post route-spec#) path))
request-map#
((fn [{:keys ~args}] ~@body)
(select-keys-with-nil (:params request-map#)
~(mapv keyword args)))))))))