(in-package :cl-zk) (defun make-clos-field (name) (let ((keyword-name (values (alexandria:make-keyword name)))) `(,name :accessor ,name :initarg ,keyword-name))) (defun writer-for-type (fieldspec stream) (let ((name (first fieldspec)) (type (second fieldspec))) (ccase type (int `(write-int ,name ,stream))))) (defmacro define-message (name superclasses fields) (let ((names (mapcar #'car fields)) (value-sym (gensym)) (stream-sym (gensym))) `(progn (defclass ,name ,superclasses ,(mapcar #'make-clos-field names)) (defmethod encode-value ((,value-sym ,name) ,stream-sym) (with-slots ,names ,value-sym ,@(mapcar (lambda (p) (writer-for-type p stream-sym)) fields)))))) (define-message connect-request () ((protocol-version int) (last-zxid-seen bigint) (timeout int) (session-id bigint) (password byte-array))) (define-message connect-request