Skip to content

Commit 952c8bc

Browse files
authored
Merge pull request #2 from jeko2000/feature/refactor-middlewares
Refactor middleware.lisp into separate logical files
2 parents 56dbe8a + 24d0ecb commit 952c8bc

13 files changed

+356
-235
lines changed

src/middleware.lisp

-216
This file was deleted.

src/middleware/builder.lisp

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
;;;; builder.lisp
2+
(in-package :cl-user)
3+
(uiop:define-package :tiny-routes.middleware.builder
4+
(:use :cl)
5+
(:export #:wrap-request-predicate
6+
#:wrap-request-mapper
7+
#:wrap-response-mapper
8+
#:wrap-response-mapper*))
9+
10+
(in-package :tiny-routes.middleware.builder)
11+
12+
(defun wrap-request-predicate (handler request-predicate)
13+
"Returns a new handler that calls HANDLER only if the request
14+
satisfies REQUEST-PREDICATE."
15+
(lambda (request)
16+
(when (funcall request-predicate request)
17+
(funcall handler request))))
18+
19+
(defun wrap-request-mapper (handler request-mapper)
20+
"Return a new handler that calls HANDLER with the result of applying
21+
REQUEST-MAPPER to request."
22+
(lambda (request)
23+
(funcall handler (funcall request-mapper request))))
24+
25+
(defun wrap-response-mapper (handler response-mapper)
26+
"Wrap HANDLER such that it returns the result of applying
27+
RESPONSE-MAPPER to response."
28+
(lambda (request)
29+
(let ((response (funcall handler request)))
30+
(typecase response
31+
(null nil)
32+
(cons (funcall response-mapper response))
33+
;; Clack allows async response in the form of a lambda
34+
(function
35+
(lambda (responder)
36+
(funcall response (lambda (res)
37+
(funcall responder
38+
(funcall response-mapper res))))))))))
39+
40+
(defun wrap-response-mapper* (handler bi-mapper)
41+
"Wrap HANDLER such that it returns the result of applying BI-MAPPER
42+
to request and response."
43+
(lambda (request)
44+
(let ((response (funcall handler request)))
45+
(typecase response
46+
(null nil)
47+
(cons (funcall bi-mapper request response))
48+
(function
49+
(lambda (responder)
50+
(funcall response (lambda (res)
51+
(funcall responder
52+
(funcall bi-mapper request res))))))))))

src/middleware/method.lisp

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
;;;; method.lisp
2+
(in-package :cl-user)
3+
(uiop:define-package :tiny-routes.middleware.method
4+
(:use :cl)
5+
(:import-from :tiny-routes.middleware.builder
6+
#:wrap-request-predicate)
7+
(:import-from :tiny-routes.request
8+
#:request-method)
9+
(:export #:wrap-request-matches-method))
10+
11+
(in-package :tiny-routes.middleware.method)
12+
13+
(defun wrap-request-matches-method (handler method)
14+
"Wrap HANDLER such that it is called only if the request method matches METHOD.
15+
16+
If METHOD is t, nil or `:any', then return HANDLER unchanged.
17+
18+
If METHOD is a list, then wrap handler such that it is called only if
19+
the request method is in the list."
20+
(check-type method (or symbol list))
21+
(cond ((or (null method) (eq method t) (eq method :any)) handler)
22+
((symbolp method) (wrap-request-predicate
23+
handler (lambda (req) (eq (request-method req) method))))
24+
((listp method) (wrap-request-predicate
25+
handler (lambda (req) (member (request-method req) method))))))

src/middleware/middleware.lisp

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
;;;; middleware.lisp
2+
(in-package :cl-user)
3+
(uiop:define-package :tiny-routes.middleware
4+
(:use :cl)
5+
(:use-reexport
6+
:tiny-routes.middleware.builder
7+
:tiny-routes.middleware.method
8+
:tiny-routes.middleware.path-template
9+
:tiny-routes.middleware.query-parameters
10+
:tiny-routes.middleware.request-body
11+
:tiny-routes.middleware.response))
12+
13+
(in-package :tiny-routes.middleware)

0 commit comments

Comments
 (0)