diff options
author | Colin Okay <okay@toyful.space> | 2022-02-13 10:38:05 -0600 |
---|---|---|
committer | Colin Okay <okay@toyful.space> | 2022-02-13 10:38:05 -0600 |
commit | 0115cd80e7df16b41db2c2e400fb3d7b7e0d75fb (patch) | |
tree | 78e6e55e2044a323b1c839ad0f2c9e3e2c972bd8 |
initial commit
-rw-r--r-- | clpmfile | 15 | ||||
-rw-r--r-- | clpmfile.lock | 244 | ||||
-rw-r--r-- | hacking.lisp | 9 | ||||
-rw-r--r-- | lazybones-client.asd | 8 | ||||
-rw-r--r-- | lazybones-client.lisp | 60 |
5 files changed, 336 insertions, 0 deletions
diff --git a/clpmfile b/clpmfile new file mode 100644 index 0000000..e31b025 --- /dev/null +++ b/clpmfile @@ -0,0 +1,15 @@ +;;; -*- Mode: common-lisp; -*- +(:api-version "0.4") + +(:source "quicklisp" :url "https://beta.quicklisp.org/dist/quicklisp.txt" :type :quicklisp) + +(:asd "lazybones-client.asd") + +(:github "lazybones" + :path "cbeo/lazybones" + :branch "master" + :systems ("lazybones")) + +(:github "lambda-riffs" + :path "cbeo/lambda-riffs" + :branch "master") diff --git a/clpmfile.lock b/clpmfile.lock new file mode 100644 index 0000000..6b7601c --- /dev/null +++ b/clpmfile.lock @@ -0,0 +1,244 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This is autogenerated by CLPM. Do not edit by hand. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(:api-version "0.4") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; BEGIN SOURCES +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +:sources +(:implicit-file :type :file-system :system-files ("lazybones-client.asd")) +(:implicit-vcs :type :vcs :projects + (("lambda-riffs" :github :path "cbeo/lambda-riffs"))) +(:implicit-vcs :type :vcs :projects + (("lazybones" :github :path "cbeo/lazybones"))) +("quicklisp" :url "https://beta.quicklisp.org/dist/quicklisp.txt" :type + :quicklisp) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; BEGIN REQUIREMENTS +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +:requirements +(:project :name "lambda-riffs" :branch "master" :source :implicit-vcs) +(:project :name "lazybones" :branch "master" :source :implicit-vcs) +(:asd-file :name "lazybones-client.asd") + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; BEGIN RELEASES +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +:releases +("alexandria" :version "2021-12-09" :source "quicklisp" :systems ("alexandria")) +("babel" :version "2020-09-25" :source "quicklisp" :systems ("babel")) +("bordeaux-threads" :version "2020-06-10" :source "quicklisp" :systems + ("bordeaux-threads")) +("cffi" :version "2021-04-11" :source "quicklisp" :systems + ("cffi" "cffi-grovel" "cffi-toolchain")) +("chipz" :version "2021-08-07" :source "quicklisp" :systems ("chipz")) +("chunga" :version "2020-04-27" :source "quicklisp" :systems ("chunga")) +("cl+ssl" :version "2021-12-30" :source "quicklisp" :systems ("cl+ssl")) +("cl-annot" :version "2015-06-08" :source "quicklisp" :systems ("cl-annot")) +("cl-base64" :version "2020-10-16" :source "quicklisp" :systems ("cl-base64")) +("cl-change-case" :version "2021-04-11" :source "quicklisp" :systems + ("cl-change-case")) +("cl-cookie" :version "2019-10-07" :source "quicklisp" :systems ("cl-cookie")) +("cl-ppcre" :version "2019-05-21" :source "quicklisp" :systems + ("cl-ppcre" "cl-ppcre-unicode")) +("cl-str" :version "2021-05-31" :source "quicklisp" :systems ("str")) +("cl-syntax" :version "2015-04-07" :source "quicklisp" :systems + ("cl-syntax" "cl-syntax-annot")) +("cl-unicode" :version "2021-02-28" :source "quicklisp" :systems ("cl-unicode")) +("cl-utilities" :version "2010-10-07" :source "quicklisp" :systems + ("cl-utilities")) +("closer-mop" :version "2021-12-30" :source "quicklisp" :systems ("closer-mop")) +("dexador" :version "2021-12-09" :source "quicklisp" :systems ("dexador")) +("fast-http" :version "2019-10-07" :source "quicklisp" :systems ("fast-http")) +("fast-io" :version "2020-09-25" :source "quicklisp" :systems ("fast-io")) +("flexi-streams" :version "2021-08-07" :source "quicklisp" :systems + ("flexi-streams")) +("jonathan" :version "2020-09-25" :source "quicklisp" :systems ("jonathan")) +("lambda-riffs" :version (:commit "f7b3c081f2361f7370c80e7ff4a432241f34ce55") + :source :implicit-vcs :systems ("lambda-riffs")) +("lazybones" :version (:commit "74eda585255b4a4d26cc783cecf2312a71370ed3") + :source :implicit-vcs :systems ("lazybones")) +("lazybones-client.asd" :version :newest :source :implicit-file :systems + ("lazybones-client")) +("lisp-namespace" :version "2021-10-21" :source "quicklisp" :systems + ("lisp-namespace")) +("local-time" :version "2021-01-24" :source "quicklisp" :systems ("local-time")) +("named-readtables" :version "2021-12-09" :source "quicklisp" :systems + ("named-readtables")) +("proc-parse" :version "2019-08-13" :source "quicklisp" :systems ("proc-parse")) +("quri" :version "2021-06-30" :source "quicklisp" :systems ("quri")) +("smart-buffer" :version "2021-10-21" :source "quicklisp" :systems + ("smart-buffer")) +("split-sequence" :version "2021-05-31" :source "quicklisp" :systems + ("split-sequence")) +("static-vectors" :version "2021-06-30" :source "quicklisp" :systems + ("static-vectors")) +("trivial-features" :version "2021-12-09" :source "quicklisp" :systems + ("trivial-features")) +("trivial-garbage" :version "2021-12-30" :source "quicklisp" :systems + ("trivial-garbage")) +("trivial-gray-streams" :version "2021-01-24" :source "quicklisp" :systems + ("trivial-gray-streams")) +("trivial-mimes" :version "2020-07-15" :source "quicklisp" :systems + ("trivial-mimes")) +("trivial-types" :version "2012-04-07" :source "quicklisp" :systems + ("trivial-types")) +("usocket" :version "2019-12-27" :source "quicklisp" :systems ("usocket")) +("xsubseq" :version "2017-08-30" :source "quicklisp" :systems ("xsubseq")) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; BEGIN REVERSE-DEPENDENCIES +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +:reverse-dependencies +("alexandria" ((:system :name "static-vectors") (:system :name "alexandria")) + ((:system :name "quri") (:system :name "alexandria")) + ((:system :name "proc-parse") (:system :name "alexandria")) + ((:system :name "lisp-namespace") (:system :name "alexandria")) + ((:system :name "lazybones") (:system :name "alexandria")) + ((:system :name "fast-io") (:system :name "alexandria")) + ((:system :name "fast-http") (:system :name "alexandria")) + ((:system :name "dexador") (:system :name "alexandria")) + ((:system :name "cl-cookie") (:system :name "alexandria")) + ((:system :name "cl-annot") (:system :name "alexandria")) + ((:system :name "cl+ssl") (:system :name "alexandria")) + ((:system :name "cffi-grovel") (:system :name "alexandria")) + ((:system :name "cffi") (:system :name "alexandria")) + ((:system :name "bordeaux-threads") (:system :name "alexandria")) + ((:system :name "babel") (:system :name "alexandria"))) + +("babel" ((:system :name "quri") (:system :name "babel")) + ((:system :name "proc-parse") (:system :name "babel")) + ((:system :name "jonathan") (:system :name "babel")) + ((:system :name "fast-http") (:system :name "babel")) + ((:system :name "dexador") (:system :name "babel")) + ((:system :name "cffi") (:system :name "babel"))) + +("bordeaux-threads" + ((:system :name "dexador") (:system :name "bordeaux-threads")) + ((:system :name "cl+ssl") (:system :name "bordeaux-threads"))) + +("cffi" ((:system :name "static-vectors") (:system :name "cffi")) + ((:system :name "static-vectors") (:system :name "cffi-grovel")) + ((:system :name "cl+ssl") (:system :name "cffi")) + ((:system :name "cffi-toolchain") (:system :name "cffi")) + ((:system :name "cffi-grovel") (:system :name "cffi")) + ((:system :name "cffi-grovel") (:system :name "cffi-toolchain"))) + +("chipz" ((:system :name "dexador") (:system :name "chipz"))) + +("chunga" ((:system :name "dexador") (:system :name "chunga"))) + +("cl+ssl" ((:system :name "dexador") (:system :name "cl+ssl"))) + +("cl-annot" ((:system :name "jonathan") (:system :name "cl-annot")) + ((:system :name "cl-syntax-annot") (:system :name "cl-annot"))) + +("cl-base64" ((:system :name "dexador") (:system :name "cl-base64"))) + +("cl-change-case" ((:system :name "str") (:system :name "cl-change-case"))) + +("cl-cookie" ((:system :name "dexador") (:system :name "cl-cookie"))) + +("cl-ppcre" ((:system :name "str") (:system :name "cl-ppcre")) + ((:system :name "str") (:system :name "cl-ppcre-unicode")) + ((:system :name "lazybones") (:system :name "cl-ppcre")) + ((:system :name "jonathan") (:system :name "cl-ppcre")) + ((:system :name "dexador") (:system :name "cl-ppcre")) + ((:system :name "cl-unicode") (:system :name "cl-ppcre")) + ((:system :name "cl-ppcre-unicode") (:system :name "cl-ppcre")) + ((:system :name "cl-cookie") (:system :name "cl-ppcre")) + ((:system :name "cl-change-case") (:system :name "cl-ppcre")) + ((:system :name "cl-change-case") (:system :name "cl-ppcre-unicode"))) + +("cl-str" ((:system :name "lazybones") (:system :name "str"))) + +("cl-syntax" ((:system :name "jonathan") (:system :name "cl-syntax")) + ((:system :name "jonathan") (:system :name "cl-syntax-annot")) + ((:system :name "cl-syntax-annot") (:system :name "cl-syntax"))) + +("cl-unicode" ((:system :name "cl-ppcre-unicode") (:system :name "cl-unicode"))) + +("cl-utilities" ((:system :name "quri") (:system :name "cl-utilities")) + ((:system :name "fast-http") (:system :name "cl-utilities"))) + +("closer-mop" ((:system :name "lazybones") (:system :name "closer-mop"))) + +("dexador" ((:system :name "lazybones-client") (:system :name "dexador"))) + +("fast-http" ((:system :name "dexador") (:system :name "fast-http"))) + +("fast-io" ((:system :name "jonathan") (:system :name "fast-io")) + ((:system :name "dexador") (:system :name "fast-io"))) + +("flexi-streams" + ((:system :name "smart-buffer") (:system :name "flexi-streams")) + ((:system :name "cl+ssl") (:system :name "flexi-streams"))) + +("jonathan" ((:system :name "lazybones") (:system :name "jonathan"))) + +("lambda-riffs" + (t (:project :name "lambda-riffs" :branch "master" :source :implicit-vcs))) + +("lazybones" ((:system :name "lazybones-client") (:system :name "lazybones")) + (t (:project :name "lazybones" :branch "master" :source :implicit-vcs))) + +("lazybones-client.asd" (t (:asd-file :name "lazybones-client.asd"))) + +("lisp-namespace" + ((:system :name "lazybones") (:system :name "lisp-namespace"))) + +("local-time" ((:system :name "cl-cookie") (:system :name "local-time"))) + +("named-readtables" + ((:system :name "cl-syntax") (:system :name "named-readtables"))) + +("proc-parse" ((:system :name "jonathan") (:system :name "proc-parse")) + ((:system :name "fast-http") (:system :name "proc-parse")) + ((:system :name "cl-cookie") (:system :name "proc-parse"))) + +("quri" ((:system :name "dexador") (:system :name "quri")) + ((:system :name "cl-cookie") (:system :name "quri"))) + +("smart-buffer" ((:system :name "fast-http") (:system :name "smart-buffer"))) + +("split-sequence" ((:system :name "usocket") (:system :name "split-sequence")) + ((:system :name "quri") (:system :name "split-sequence"))) + +("static-vectors" ((:system :name "fast-io") (:system :name "static-vectors"))) + +("trivial-features" + ((:system :name "dexador") (:system :name "trivial-features")) + ((:system :name "cl+ssl") (:system :name "trivial-features")) + ((:system :name "cffi") (:system :name "trivial-features")) + ((:system :name "babel") (:system :name "trivial-features"))) + +("trivial-garbage" ((:system :name "cl+ssl") (:system :name "trivial-garbage"))) + +("trivial-gray-streams" + ((:system :name "flexi-streams") (:system :name "trivial-gray-streams")) + ((:system :name "fast-io") (:system :name "trivial-gray-streams")) + ((:system :name "dexador") (:system :name "trivial-gray-streams")) + ((:system :name "cl+ssl") (:system :name "trivial-gray-streams")) + ((:system :name "chunga") (:system :name "trivial-gray-streams"))) + +("trivial-mimes" ((:system :name "dexador") (:system :name "trivial-mimes"))) + +("trivial-types" ((:system :name "jonathan") (:system :name "trivial-types")) + ((:system :name "cl-syntax") (:system :name "trivial-types"))) + +("usocket" ((:system :name "dexador") (:system :name "usocket")) + ((:system :name "cl+ssl") (:system :name "usocket"))) + +("xsubseq" ((:system :name "smart-buffer") (:system :name "xsubseq")) + ((:system :name "fast-http") (:system :name "xsubseq"))) + diff --git a/hacking.lisp b/hacking.lisp new file mode 100644 index 0000000..2858157 --- /dev/null +++ b/hacking.lisp @@ -0,0 +1,9 @@ +(defpackage #:an-api + (:use #:cl) + (:local-nicknames (:lzb :lazybones))) + +(in-package :an-api) + +(lzb:defendpoint* :get "/search/:where parse-integer:" ((name identity) (age parse-integer)) () + "This is documentation" + (lzb:http-ok (format nil "~a ~a ~a" where name age))) diff --git a/lazybones-client.asd b/lazybones-client.asd new file mode 100644 index 0000000..05af521 --- /dev/null +++ b/lazybones-client.asd @@ -0,0 +1,8 @@ +(asdf:defsystem #:lazybones-client + :description "Generate client functions for a LAZYBONES:APP instance" + :author "Colin Okay <okay@toyful.space>" + :license "AGPLv3" + :version "0.1.0" + :serial t + :depends-on (#:lazybones #:dexador) + :components ((:file "lazybones-client"))) diff --git a/lazybones-client.lisp b/lazybones-client.lisp new file mode 100644 index 0000000..1c66b1b --- /dev/null +++ b/lazybones-client.lisp @@ -0,0 +1,60 @@ +;;;; lazybones-client.lisp -- macro to generate a set of http request functions given an APP instance + +(defpackage #:lazybones-client + (:use #:cl)) + +(in-package :lazybones-client) + +(defvar *host* nil + "The host to which the client will send its requests.") + +(defun make-defun-name (method dispatch-pattern) + "Utility for making function names for endpoint request functions." + (intern + (with-output-to-string (*standard-output*) + (princ method) (princ "-") + (loop for (term . more) on dispatch-pattern + when (and (stringp term) (plusp (length term))) + do (princ (string-upcase term)) + when (listp term) + do (princ (string-upcase (car term))) + when more + do (princ "-"))))) + +(defun endpoint-to-defun-name (ep) + (with-slots (lazybones::method lazybones::dispatch-pattern) ep + (make-defun-name lazybones::method lazybones::dispatch-pattern))) + +(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 params-to-query-string (params) + (mapcar 'parma-to-string params)) + +(defun generate-client-function (ep) + (let ((defun-name + (endpoint-to-defun-name ep)) + (vars + (mapcar 'intern (lazybones::endpoint-route-vars ep))) + (format-string + (dispatch-pattern-to-format-string (lazybones::endpoint-dispatch-pattern ep))) + (qparams + (mapcar + (lambda (x) (intern (symbol-name (first x)))) + (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) + + ) + ) + ))) + + |