summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Okay <okay@toyful.space>2022-02-13 13:49:28 -0600
committerColin Okay <okay@toyful.space>2022-02-13 13:49:28 -0600
commit664803f2eecd3824d3b7569b38600aa083b7dcb1 (patch)
tree008738496d13fa573bf809474e067f2420eb028d
parent0115cd80e7df16b41db2c2e400fb3d7b7e0d75fb (diff)
This generates code
-rw-r--r--lazybones-client.lisp80
1 files changed, 68 insertions, 12 deletions
diff --git a/lazybones-client.lisp b/lazybones-client.lisp
index 1c66b1b..008e86f 100644
--- a/lazybones-client.lisp
+++ b/lazybones-client.lisp
@@ -1,7 +1,9 @@
;;;; lazybones-client.lisp -- macro to generate a set of http request functions given an APP instance
(defpackage #:lazybones-client
- (:use #:cl))
+ (:use #:cl)
+ (:export #:*host*
+ #:generate-client-system))
(in-package :lazybones-client)
@@ -28,13 +30,17 @@
(defun dispatch-pattern-to-format-string (pattern)
(str:join "/" (mapcar (lambda (x) (if (listp x) "~a" x)) pattern)))
-(defun param-to-string (p)
- `(if ,p (concatenate 'string (symbol-name ',p) "=" (format nil "~a" ,p)) ""))
+(defun param-to-string (p &optional prefix)
+ (if prefix
+ `(if ,p (concatenate 'string "&" (symbol-name ',p) "=" (format nil "~a" ,p)) "")
+ `(if ,p (concatenate 'string (symbol-name ',p) "=" (format nil "~a" ,p)) "")))
(defun params-to-query-string (params)
- (mapcar 'parma-to-string params))
+ (loop for count from 0
+ for p in params
+ collect (param-to-string p (plusp count))))
-(defun generate-client-function (ep)
+(defun generate-client-function-for-endpoint (ep)
(let ((defun-name
(endpoint-to-defun-name ep))
(vars
@@ -47,14 +53,64 @@
(lazybones::endpoint-params ep)))
(dex-fn
(intern (symbol-name (lazybones::endpoint-method ep)) :dexador)))
-
`(defun ,defun-name (,@vars ,@(when qparams (cons '&key qparams)))
,(lazybones::endpoint-documentation ep)
- (,dex-fn (concatenate 'string
- (format nil ,format-string ,@vars)
-
- )
- )
- )))
+ (,dex-fn (apply #'concatenate
+ 'string
+ lazybones-client::*host*
+ (format nil ,format-string ,@vars)
+ (when (or ,@qparams)
+ (list "?" ,@(params-to-query-string qparams))))))))
+
+
+(defun generate-client-functions-for-app (app)
+ (loop for ep in (lazybones::app-endpoints app)
+ collect (generate-client-function-for-endpoint ep)))
+
+(defun app-client-package-name (app)
+ (format nil "~a-CLIENT" (lazybones::app-name app)))
+
+(defun generate-defsystem-for-client-of-app (app)
+ (with-output-to-string (*standard-output*)
+ (princ "(asdf:defsystem #:") (princ (app-client-package-name app))
+ (terpri)
+ (princ " :depends-on (#:lazybones-client)")
+ (terpri)
+ (princ " :components ((:file ")
+ (princ #\")
+ (princ (string-downcase (app-client-package-name app)))
+ (princ #\")
+ (princ ")))")))
+(defun generate-defpackage-for-client-of-app (app)
+ (with-output-to-string (out)
+ (format
+ out
+ "(defpackage :~a (:use :cl))"
+ (app-client-package-name app))
+ (terpri out)
+ (format out "(in-package :~a)" (app-client-package-name app))
+ (terpri out)))
+
+(defun client-asd-file-name (app)
+ (format nil "~a.asd" (string-downcase (app-client-package-name app))))
+
+(defun client-lisp-file-name (app)
+ (format nil "~a.lisp" (string-downcase (app-client-package-name app))))
+
+
+(defun generate-client-system (directory app)
+ (assert (uiop:directory-exists-p directory))
+ (alexandria:write-string-into-file
+ (generate-defsystem-for-client-of-app app)
+ (merge-pathnames (client-asd-file-name app) directory)
+ :if-exists :supersede)
+ (alexandria:write-string-into-file
+ (with-output-to-string (*standard-output*)
+ (princ (generate-defpackage-for-client-of-app app))
+ (terpri)
+ (dolist (form (generate-client-functions-for-app app))
+ (print form)
+ (terpri)))
+ (merge-pathnames (client-lisp-file-name app) directory)))