mirror of
https://github.com/metosin/reitit.git
synced 2025-12-16 16:01:11 +00:00
remove interceptors in favor of Sieppari
This commit is contained in:
parent
5e7be28eb7
commit
60f10cdc01
1 changed files with 0 additions and 102 deletions
|
|
@ -94,105 +94,3 @@
|
|||
([data opts]
|
||||
(let [opts (meta-merge {:coerce coerce-handler, :compile compile-result} opts)]
|
||||
(r/router data opts))))
|
||||
|
||||
(ns reitit.interceptor.simple)
|
||||
|
||||
(defn enqueue [ctx interceptors]
|
||||
(update ctx :queue (fnil into clojure.lang.PersistentQueue/EMPTY) interceptors))
|
||||
|
||||
|
||||
(defn leave [ctx stack key]
|
||||
(let [it (clojure.lang.RT/iter stack)]
|
||||
(loop [ctx ctx, key key]
|
||||
(if (.hasNext it)
|
||||
(if-let [f (-> it .next key)]
|
||||
(let [[ctx key] (try
|
||||
[(f ctx)])])
|
||||
(recur
|
||||
(try
|
||||
(leave ctx)))
|
||||
(recur ctx))
|
||||
ctx))))
|
||||
|
||||
(defn try-f [ctx f]
|
||||
(try
|
||||
(f ctx)
|
||||
(catch Exception e
|
||||
(assoc ctx :error e))))
|
||||
|
||||
(defn enter [ctx]
|
||||
(let [queue ^clojure.lang.PersistentQueue (:queue ctx)
|
||||
stack (:stack ctx)
|
||||
error (:error ctx)
|
||||
interceptor (peek queue)]
|
||||
(cond
|
||||
|
||||
;; all done
|
||||
(not interceptor)
|
||||
(leave ctx stack :leave)
|
||||
|
||||
;; error
|
||||
error
|
||||
(leave (assoc ctx :queue nil) stack :error)
|
||||
|
||||
;; continue
|
||||
:else
|
||||
(let [queue (pop queue)
|
||||
stack (conj stack interceptor)
|
||||
f (or (:enter interceptor) identity)
|
||||
ctx (-> ctx (assoc :queue queue) (assoc :stack stack) (try-f f))]
|
||||
(recur ctx)))))
|
||||
|
||||
(defrecord Context [queue stack request response])
|
||||
|
||||
(defn context [interceptors request]
|
||||
(->Context (into clojure.lang.PersistentQueue/EMPTY interceptors) nil request nil))
|
||||
|
||||
(defn execute [interceptors request]
|
||||
(enter (context interceptors request)))
|
||||
|
||||
(ns user)
|
||||
|
||||
(require '[reitit.http :as http])
|
||||
(require '[reitit.interceptor.simple :as simple])
|
||||
|
||||
(def i (fn [value]
|
||||
{:enter (fn [ctx]
|
||||
(update-in ctx [:request :enter] (fnil conj []) value))
|
||||
:leave (fn [ctx]
|
||||
(update-in ctx [:response :body :leave] (fnil conj []) value))}))
|
||||
|
||||
(def f (fn [key] {key (fn [ctx] (throw (ex-info "fail" {})))}))
|
||||
|
||||
(def app
|
||||
(http/http-handler
|
||||
(http/router
|
||||
["/api"
|
||||
{:interceptors [(i 1) (i 2)]}
|
||||
["/ipa"
|
||||
{:interceptors [(i 3) (f :enter) (i 4)]
|
||||
:handler (fn [{:keys [enter]}]
|
||||
{:status 200
|
||||
:body {:enter enter}})}]])
|
||||
simple/execute))
|
||||
|
||||
(app {:request-method :get, :uri "/api/ipa"})
|
||||
; => {:status 200, :body {:enter [1 2 3 4], :leave [4 3 2 1]}}
|
||||
|
||||
(def app2
|
||||
(http/http-handler
|
||||
(http/router
|
||||
["/api"
|
||||
{:interceptors [(i 1) (i 2)]}
|
||||
["/ipa"
|
||||
{:interceptors [(i 3) (i 4) (fn [ctx]
|
||||
(assoc ctx
|
||||
:response
|
||||
{:status 200
|
||||
:body {:enter (-> ctx
|
||||
:request
|
||||
:enter)}}))]}]])
|
||||
simple/execute))
|
||||
|
||||
(app2 {:request-method :get, :uri "/api/ipa"})
|
||||
; => {:status 200, :body {:enter [1 2 3 4], :leave [4 3 2 1]}}
|
||||
|
|
|
|||
Loading…
Reference in a new issue