summaryrefslogtreecommitdiff
path: root/src/tg/macros.lisp
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2025-10-13 00:26:15 +0300
committerGravatar Uko Kokņevičs2025-10-13 00:26:15 +0300
commit0749b67b29db8773e840345cc67963a1c1545cba (patch)
tree49dbd89b310645ec081cdad8632d8a45ebbb79e4 /src/tg/macros.lisp
parentRename tg-types to just tg (diff)
downloadukkoclot-0749b67b29db8773e840345cc67963a1c1545cba.tar.gz
ukkoclot-0749b67b29db8773e840345cc67963a1c1545cba.tar.xz
ukkoclot-0749b67b29db8773e840345cc67963a1c1545cba.zip
Move define-tg-method to a new file
Diffstat (limited to '')
-rw-r--r--src/tg/macros.lisp26
1 files changed, 1 insertions, 25 deletions
diff --git a/src/tg/macros.lisp b/src/tg/macros.lisp
index 92afd6e..9577d94 100644
--- a/src/tg/macros.lisp
+++ b/src/tg/macros.lisp
@@ -7,7 +7,7 @@
7 (:import-from :ukkoclot/strings :lisp->snake-case) 7 (:import-from :ukkoclot/strings :lisp->snake-case)
8 (:local-nicknames 8 (:local-nicknames
9 (:jzon :com.inuoe.jzon)) 9 (:jzon :com.inuoe.jzon))
10 (:export :define-tg-method :define-tg-type)) 10 (:export :define-tg-type))
11(in-package :ukkoclot/tg/macros) 11(in-package :ukkoclot/tg/macros)
12 12
13(eval-when (:compile-toplevel :load-toplevel :execute) 13(eval-when (:compile-toplevel :load-toplevel :execute)
@@ -74,30 +74,6 @@
74 (defun field->struct-spec (field) 74 (defun field->struct-spec (field)
75 (list (field-name field) (field-default field) :type (field-type field)))) 75 (list (field-name field) (field-default field) :type (field-type field))))
76 76
77;; TODO: Automatically derive path from name
78;; TODO: Automatically derive mapfn from type
79(defmacro define-tg-method (
80 (name type path &optional (method :POST))
81 &body field-specs)
82 (let* ((fields (parse-field-specs field-specs))
83 (revfields (reverse fields))
84 (args (gensym "ARGS"))
85 (bot (gensym "BOT-")))
86 `(progn
87 (declaim (ftype (function (bot &key ,@(loop for field in fields
88 collect (field->ftype-spec field)))
89 ,type)
90 ,name))
91 (defun ,name (,bot &key ,@(loop for field in fields collect (field->defun-spec field)))
92 (let (,args)
93 ,@(loop for field in revfields
94 collecting
95 (if (field-skip-if-default field)
96 `(unless (equal ,(field-name field) ,(field-default field))
97 (setf ,args (acons ',(field-name field) ,(field-name field) ,args)))
98 `(setf ,args (acons ',(field-name field) ,(field-name field) ,args))))
99 (do-call ,bot ,method ,path ',type ,args))))))
100
101(defmacro define-tg-type (name &body field-specs) 77(defmacro define-tg-type (name &body field-specs)
102 (let* ((fields (parse-field-specs field-specs)) 78 (let* ((fields (parse-field-specs field-specs))
103 (revfields (reverse fields)) 79 (revfields (reverse fields))