-
-
Notifications
You must be signed in to change notification settings - Fork 63
/
helper.lisp
51 lines (48 loc) · 1.7 KB
/
helper.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
(in-package :cl-user)
(defpackage caveman2.helper
(:use :cl)
(:import-from :caveman2.app
:*current-app*
:*response*)
(:import-from :lack.response
:response-headers
:response-status)
(:import-from :ningle.app
:mapper)
(:import-from :myway
:mapper-routes
:route-name
#+nil :url-for)
(:import-from :quri
:url-encode)
(:export :url-for))
(in-package :caveman2.helper)
(defun redirect (url &optional (status 302))
(setf (getf (response-headers *response*) :location) url)
(setf (response-status *response*) status)
url)
(defun add-query-parameters (base-url params)
"Add a query parameters string of PARAMS to BASE-URL."
(unless params
(return-from add-query-parameters base-url))
(loop for (name value) on params by #'cddr
collect (format nil "~A=~A"
(url-encode (princ-to-string name))
(url-encode (princ-to-string value)))
into parts
finally
(return
(let ((params-string (format nil "~{~A~^&~}" parts)))
(format nil "~A~A~A"
base-url
(if (find #\? base-url) "&" "?")
params-string)))))
(defun url-for (route-name &rest params)
(let ((route (find-if #'(lambda (route)
(string-equal (route-name route) route-name))
(mapper-routes (mapper *current-app*)))))
(if route
(multiple-value-bind (base-url rest-params)
(myway:url-for route params)
(add-query-parameters base-url rest-params))
(error "No route found for ~S" route-name))))