;; (setq lexical-binding t) ;; (dbus--annotate-arg '(:array :int32) '(1 2 3)) ;; ;=> ((:array :int32 1 :int32 2 :int32 3)) ;; (dbus--annotate-arg '(:array (:dict-entry :string :int32)) '(("a" . 1) ("b" . 2))) ;; ;=> ((:array (:dict-entry :string "a" :int32 1) (:dict-entry :string "b" :int32 2))) ;; (dbus--annotate-arg '(:struct :object-path (:array :signature) :string) ;; '("path" ("sig") "password")) ;; ;=> ((:struct :object-path "path" (:array :signature "sig") :string "password")) (defun dbus--annotate-arg (type arg) (pcase type ((and basic (or :byte :boolean :int16 :uint16 :int32 :uint32 :double :string :object-path :signature :unix-fd)) (list basic arg)) (`(:array ,elttype) (list (cons :array (apply #'nconc (mapcar (lambda (subarg) (dbus--annotate-arg elttype subarg)) arg))))) (`(,(and symbol (or :variant :struct)) . ,memtypes) (list (cons symbol (apply #'nconc (cl-mapcar (lambda (memtype subarg) (dbus--annotate-arg memtype subarg)) memtypes arg))))) (`(:dict-entry ,keytype ,valtype) (list (cons :dict-entry (nconc (dbus--annotate-arg keytype (car arg)) (dbus--annotate-arg valtype (cdr arg)))))) (_ (error "Unknown type specification: %S" type))))