osc/osc-data.lisp

67 lines
1.6 KiB
Common Lisp
Raw Normal View History

2015-08-25 19:59:32 +00:00
(cl:in-package #:osc)
;; Classes
(defclass osc-data () ())
(defclass message (osc-data)
((command
:reader command
:initarg :command)
(args
:reader args
:initarg :args
:initform nil)))
(defclass bundle (osc-data)
((timetag
:reader timetag
:initarg :timetag
:initform :now)
(elements
:reader elements
:initarg :elements
:initform nil)))
;; Constructors
(defun make-message (command args)
(unless (listp args)
(setf args (list args)))
(make-instance 'message
:command command
:args args))
(defun message (command &rest args)
(make-message command args))
(defun make-bundle (timetag elements)
(unless (listp elements)
(setf elements (list elements)))
(make-instance 'bundle
:timetag timetag
:elements elements))
(defun bundle (timetag &rest elements)
(make-bundle timetag elements))
(defgeneric format-osc-data (data &key stream width))
(defmethod format-osc-data ((message message) &key (stream t)
(width 80))
(let ((args-string (format nil "~{~a~^ ~}" (args message))))
(when (> (length args-string) width)
(setf args-string
(concatenate 'string
(subseq args-string 0 width)
"...")))
(format stream "~a ~a~%"
(command message)
args-string)))
(defmethod format-osc-data ((bundle bundle) &key (stream t) (width 80))
(format stream "~&[ ~a~%" (timetag bundle))
(dolist (element (elements bundle))
(format-osc-data element :stream stream :width width))
(format stream "~&]~%"))