A fast data-driven routing library for Clojure/Script
Find a file
Alexander Kiel a19849fe58 Make Map Destructuring of Namespaced Keys more Beautiful
It's possible to put the :keys keyword in the namespace of the keys one likes to
destructure. With that one can use symbols in the vector again. One advantage of
having symbols is, that Cursive grays them out if not used. I found two
occurrences of unused destructured keys.
2019-07-13 17:02:41 +03:00
.circleci Add step to verify cljdoc.edn as part of CI 2018-10-22 20:46:48 +02:00
dev-resources test perf with different json 2018-08-25 13:28:44 +03:00
doc Make Map Destructuring of Namespaced Keys more Beautiful 2019-07-13 17:02:41 +03:00
examples 0.3.9 2019-06-16 20:20:49 +03:00
modules Make Map Destructuring of Namespaced Keys more Beautiful 2019-07-13 17:02:41 +03:00
perf-test/clj/reitit Merge pull request #263 from metosin/north 2019-05-10 14:28:39 +03:00
scripts New reitit-dev module for pretty errors 2019-03-03 20:54:21 +02:00
test Make Map Destructuring of Namespaced Keys more Beautiful 2019-07-13 17:02:41 +03:00
.gitignore Create example 2018-07-12 12:46:41 +03:00
book.json initial rework 2018-09-02 19:23:18 +03:00
CHANGELOG.md Make Map Destructuring of Namespaced Keys more Beautiful 2019-07-13 17:02:41 +03:00
CONTRIBUTING.md Fix typos 2019-05-22 19:17:10 +02:00
LICENSE Initial commit 2017-08-07 14:15:45 +03:00
package-lock.json Update JS testing dependencies 2019-06-08 14:00:20 +03:00
package.json Update JS testing dependencies 2019-06-08 14:00:20 +03:00
project.clj 0.3.9 2019-06-16 20:20:49 +03:00
README.md 0.3.9 2019-06-16 20:20:49 +03:00

reitit Build Status cljdoc badge

A fast data-driven router for Clojure(Script).

Presentations:

Full Documentation

There is #reitit in Clojurians Slack for discussion & help.

Main Modules

  • reitit - all bundled
  • reitit-core - the routing core
  • reitit-ring - a ring router
  • reitit-middleware - common middleware
  • reitit-spec clojure.spec coercion
  • reitit-schema Schema coercion
  • reitit-swagger Swagger2 apidocs
  • reitit-swagger-ui Integrated Swagger UI
  • reitit-frontend Tools for frontend routing
  • reitit-http http-routing with Interceptors
  • reitit-interceptors - common interceptors
  • reitit-sieppari support for Sieppari
  • reitit-dev - development utilities

Extra modules

Latest version

All main modules bundled:

[metosin/reitit "0.3.9"]

Optionally, the parts can be required separately.

Quick start

(require '[reitit.core :as r])

(def router
  (r/router
    [["/api/ping" ::ping]
     ["/api/orders/:id" ::order]]))

(r/match-by-path router "/api/ping")
; #Match{:template "/api/ping"
;        :data {:name ::ping}
;        :result nil
;        :path-params {}
;        :path "/api/ping"}

(r/match-by-name router ::order {:id 2})
; #Match{:template "/api/orders/:id",
;        :data {:name ::order},
;        :result nil,
;        :path-params {:id 2},
;        :path "/api/orders/2"}

Ring example

A Ring routing app with input & output coercion using data-specs.

(require '[reitit.ring :as ring])
(require '[reitit.coercion.spec])
(require '[reitit.ring.coercion :as rrc])

(def app
  (ring/ring-handler
    (ring/router
      ["/api"
       ["/math" {:get {:parameters {:query {:x int?, :y int?}}
                       :responses {200 {:body {:total pos-int?}}}
                       :handler (fn [{{{:keys [x y]} :query} :parameters}]
                                  {:status 200
                                   :body {:total (+ x y)}})}}]]
      ;; router data effecting all routes
      {:data {:coercion reitit.coercion.spec/coercion
              :middleware [rrc/coerce-exceptions-middleware
                           rrc/coerce-request-middleware
                           rrc/coerce-response-middleware]}})))

Valid request:

(app {:request-method :get
      :uri "/api/math"
      :query-params {:x "1", :y "2"}})
; {:status 200
;  :body {:total 3}}

Invalid request:

(app {:request-method :get
      :uri "/api/math"
      :query-params {:x "1", :y "a"}})
;{:status 400,
; :body {:type :reitit.coercion/request-coercion,
;        :coercion :spec,
;        :spec "(spec-tools.core/spec {:spec (clojure.spec.alpha/keys :req-un [:$spec20745/x :$spec20745/y]), :type :map, :keys #{:y :x}, :keys/req #{:y :x}})",
;        :problems [{:path [:y],
;                    :pred "clojure.core/int?",
;                    :val "a",
;                    :via [:$spec20745/y],
;                    :in [:y]}],
;        :value {:x "1", :y "a"},
;        :in [:request :query-params]}}

More examples

All examples are in https://github.com/metosin/reitit/tree/master/examples

More info

Check out the full documentation!

Join #reitit channel in Clojurians slack.

Roadmap is mostly written in issues.

Special thanks

License

Copyright © 2017-2019 Metosin Oy

Distributed under the Eclipse Public License, the same as Clojure.