-
Notifications
You must be signed in to change notification settings - Fork 11
/
wrap.clj
36 lines (32 loc) · 1.16 KB
/
wrap.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
28
29
30
31
32
33
34
35
36
(ns framework.interceptor.wrap
"To wrap any kind of middlewares and interceptors to xiana flow."
(:require
[xiana.core :as xiana]))
(defn interceptor
"Interceptor wrapper to use xiana monad."
[in]
(cond-> {}
(:enter in) (assoc :enter (fn [state] (xiana/ok ((:enter in) state))))
(:leave in) (assoc :leave (fn [state] (xiana/ok ((:leave in) state))))
(:error in) (assoc :error (fn [state] (xiana/error ((:error in) state))))))
(defn- middleware-fn
"Simple enter/leave middleware function generator."
[m k]
(fn [{r k :as state}]
(xiana/ok (-> state (assoc k (m r))))))
(defn middleware->enter
"Parse middleware function to interceptor enter lambda function."
([middleware]
(middleware->enter {} middleware))
([interceptor middleware]
(let [m (middleware identity)
f (middleware-fn m :request)]
(-> interceptor (assoc :enter f)))))
(defn middleware->leave
"Parse middleware function to interceptor leave lambda function."
([middleware]
(middleware->leave {} middleware))
([interceptor middleware]
(let [m (middleware identity)
f (middleware-fn m :response)]
(-> interceptor (assoc :leave f)))))