From 191a27fd142af7a14ca6ad1abcd293f09e63f6ad Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Mon, 13 Oct 2025 05:21:41 +0300 Subject: Move serializing stuff from bot/impl to a new file --- src/bot/impl.lisp | 61 ++----------------------------------------------------- 1 file changed, 2 insertions(+), 59 deletions(-) (limited to 'src/bot/impl.lisp') diff --git a/src/bot/impl.lisp b/src/bot/impl.lisp index 652e2f7..93e63f5 100644 --- a/src/bot/impl.lisp +++ b/src/bot/impl.lisp @@ -6,67 +6,16 @@ (:import-from :cl+ssl) (:import-from :dex) (:import-from :log) + (:import-from :ukkoclot/serializing :fixup-args :parse-value) (:import-from :ukkoclot/strings :lisp->snake-case) (:local-nicknames (:jzon :com.inuoe.jzon)) (:export - :bot :bot-p :make-bot :fixup-value :do-call :parse-value + :bot :bot-p :make-bot :do-call :bot-config :bot-db :bot-base-uri :bot-power-on :bot-username% :bot-id%)) (in-package :ukkoclot/bot/impl) -(defgeneric parse-value (type json) - (:documentation "Parse value of TYPE from the parsed JSON") - (:method (type json) - (log:error "I don't know how to parse simple type ~A!" type) - (error "I don't know how to parse simple type ~A!" type)) - (:method ((type (eql 'boolean)) json) - (check-type json boolean) - json) - (:method ((type (eql 'integer)) json) - (check-type json integer) - json) - (:method ((type (eql 'null)) json) - (check-type json null) - json) - (:method ((type (eql 'string)) json) - (check-type json string) - json)) - -(defun try-parse-value (type json) - (handler-case (values t (parse-value type json)) - (error () (values nil nil)))) - -(defmethod parse-value ((type cons) json) - (cond ((and (eq (car type) 'array) - (null (cddr type))) - (when json - (let ((element-type (cadr type))) - (iter (for element in-vector json) - (collect (parse-value element-type element) result-type vector))))) - ((eq (car type) 'or) - (iter (for el-type in (cdr type)) - (multiple-value-bind (success res) (try-parse-value el-type json) - (when success - (return res))) - (finally - (error "Failed to parse ~S as ~A!" json type)))) - (t - (error "I don't know how to parse complex type ~A!" type)))) - -(defgeneric fixup-value (value) - (:documentation "Fixup top-level VALUE before passing it onto telegram") - (:method (value) - (jzon:stringify value :pretty *print-pretty*)) - (:method ((value null)) - value) - (:method ((value number)) - value) - (:method ((value pathname)) - value) - (:method ((value string)) - value)) - (defstruct (bot (:constructor make-bot%)) (config (error "No value given for config") :read-only t) (db (error "No value given for DB") :read-only t) @@ -81,12 +30,6 @@ (config-bot-token config) "/"))) (make-bot% :config config :db db :base-uri base-uri))) -(defun fixup-args (args) - (iter (for (key . value) in args) - (collect - (cons (string-downcase (lisp->snake-case (symbol-name key))) - (fixup-value value))))) - (defun req (uri method content) (let ((retrier (dex:retry-request 5 :interval 1))) (handler-case (dex:request uri :method method :content content) -- cgit v1.2.3