summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Okay <okay@toyful.space>2022-02-13 10:38:05 -0600
committerColin Okay <okay@toyful.space>2022-02-13 10:38:05 -0600
commit0115cd80e7df16b41db2c2e400fb3d7b7e0d75fb (patch)
tree78e6e55e2044a323b1c839ad0f2c9e3e2c972bd8
initial commit
-rw-r--r--clpmfile15
-rw-r--r--clpmfile.lock244
-rw-r--r--hacking.lisp9
-rw-r--r--lazybones-client.asd8
-rw-r--r--lazybones-client.lisp60
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)
+
+ )
+ )
+ )))
+
+