From 13141027ee579e2885c63f2999e03e3c64908aed Mon Sep 17 00:00:00 2001 From: Miloslav Nenadal Date: Sat, 17 Nov 2018 11:11:55 +0100 Subject: [PATCH] Support swagger with async ring --- .../reitit-swagger/src/reitit/swagger.cljc | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/modules/reitit-swagger/src/reitit/swagger.cljc b/modules/reitit-swagger/src/reitit/swagger.cljc index 8340b250..47caeff4 100644 --- a/modules/reitit-swagger/src/reitit/swagger.cljc +++ b/modules/reitit-swagger/src/reitit/swagger.cljc @@ -73,32 +73,38 @@ (defn create-swagger-handler [] "Create a ring handler to emit swagger spec. Collects all routes from router which have an intersecting `[:swagger :id]` and which are not marked with `:no-doc` route data." - (fn [{:keys [::r/router ::r/match :request-method]}] - (let [{:keys [id] :or {id ::default} :as swagger} (-> match :result request-method :data :swagger) - ->set (fn [x] (if (or (set? x) (sequential? x)) (set x) (conj #{} x))) - ids (->set id) - strip-top-level-keys #(dissoc % :id :info :host :basePath :definitions :securityDefinitions) - strip-endpoint-keys #(dissoc % :id :parameters :responses :summary :description) - swagger (->> (strip-endpoint-keys swagger) - (merge {:swagger "2.0" - :x-id ids})) - accept-route (fn [route] - (-> route second :swagger :id (or ::default) ->set (set/intersection ids) seq)) - transform-endpoint (fn [[method {{:keys [coercion no-doc swagger] :as data} :data - middleware :middleware - interceptors :interceptors}]] - (if (and data (not no-doc)) - [method - (meta-merge + (fn create-swagger + ([{:keys [::r/router ::r/match :request-method]}] + (let [{:keys [id] :or {id ::default} :as swagger} (-> match :result request-method :data :swagger) + ->set (fn [x] (if (or (set? x) (sequential? x)) (set x) (conj #{} x))) + ids (->set id) + strip-top-level-keys #(dissoc % :id :info :host :basePath :definitions :securityDefinitions) + strip-endpoint-keys #(dissoc % :id :parameters :responses :summary :description) + swagger (->> (strip-endpoint-keys swagger) + (merge {:swagger "2.0" + :x-id ids})) + accept-route (fn [route] + (-> route second :swagger :id (or ::default) ->set (set/intersection ids) seq)) + transform-endpoint (fn [[method {{:keys [coercion no-doc swagger] :as data} :data + middleware :middleware + interceptors :interceptors}]] + (if (and data (not no-doc)) + [method + (meta-merge (apply meta-merge (keep (comp :swagger :data) middleware)) (apply meta-merge (keep (comp :swagger :data) interceptors)) (if coercion (coercion/get-apidocs coercion :swagger data)) (select-keys data [:tags :summary :description]) (strip-top-level-keys swagger))])) - transform-path (fn [[p _ c]] - (if-let [endpoint (some->> c (keep transform-endpoint) (seq) (into {}))] - [(path->template p) endpoint]))] - (let [paths (->> router (r/compiled-routes) (filter accept-route) (map transform-path) (into {}))] - {:status 200 - :body (meta-merge swagger {:paths paths})})))) + transform-path (fn [[p _ c]] + (if-let [endpoint (some->> c (keep transform-endpoint) (seq) (into {}))] + [(path->template p) endpoint]))] + (let [paths (->> router (r/compiled-routes) (filter accept-route) (map transform-path) (into {}))] + {:status 200 + :body (meta-merge swagger {:paths paths})}))) + ([req res raise] + (try + (res (create-swagger req)) + (catch #?(:clj Exception :cljs :default) e + (raise e))))))