remove interceptors in favor of Sieppari

This commit is contained in:
Tommi Reiman 2018-08-16 21:29:25 +03:00
parent 5e7be28eb7
commit 60f10cdc01

View file

@ -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]}}