diff options
author | Colin Okay <okay@toyful.space> | 2022-02-13 13:49:28 -0600 |
---|---|---|
committer | Colin Okay <okay@toyful.space> | 2022-02-13 13:49:28 -0600 |
commit | 664803f2eecd3824d3b7569b38600aa083b7dcb1 (patch) | |
tree | 008738496d13fa573bf809474e067f2420eb028d | |
parent | 0115cd80e7df16b41db2c2e400fb3d7b7e0d75fb (diff) |
This generates code
-rw-r--r-- | lazybones-client.lisp | 80 |
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))) |