diff --git a/modules/reitit-http/src/reitit/http.cljc b/modules/reitit-http/src/reitit/http.cljc index 08d812f1..8da70d88 100644 --- a/modules/reitit-http/src/reitit/http.cljc +++ b/modules/reitit-http/src/reitit/http.cljc @@ -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]}}