actors: New read-message procedures, touch up write-message procedures
authorChristopher Allan Webber <cwebber@dustycloud.org>
Fri, 22 Apr 2016 15:03:08 +0000 (10:03 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Mon, 25 Apr 2016 14:25:36 +0000 (09:25 -0500)
* 8sync/systems/actors.scm (read-message, read-message-from-string):
  New procedures for reading in a serialized message.
  (write-message): Supply a default port (current-output-port) if none
  is provided.
  (serialize-message, serialize-message-pretty): Write out message-wants-reply,
  which we accidentally left out earlier.

8sync/systems/actors.scm

index 0ae6e054c0c0eec3ea57f34f9d131f13efb0b023..bd164be2c26199e1f2fa1a6730085dddd162e777 100644 (file)
@@ -573,10 +573,11 @@ an integer."
    (message-action message)
    (message-body message)
    (message-in-reply-to message)
+   (message-wants-reply message)
    (message-replied message)
    (message-deferred-reply message)))
 
-(define (write-message message port)
+(define* (write-message message #:optional (port (current-output-port)))
   "Write out a message to a port for easy reading later.
 
 Note that if a sub-value can't be easily written to something
@@ -593,9 +594,28 @@ to improve that.  You'll need a better serializer for that.."
     (action ,(message-action message))
     (body ,(message-body message))
     (in-reply-to ,(message-in-reply-to message))
+    (wants-reply ,(message-wants-reply message))
     (replied ,(message-replied message))
     (deferred-reply ,(message-deferred-reply message))))
 
 (define (pprint-message message)
   "Pretty print a message."
   (pretty-print (serialize-message-pretty message)))
+
+(define* (read-message #:optional (port (current-input-port)))
+  "Read a message serialized via serialize-message from PORT"
+  (match (read port)
+    ((id to from action body in-reply-to wants-reply replied deferred-reply)
+     (make-message-intern
+      id to from action body
+      in-reply-to wants-reply replied deferred-reply))
+    (anything-else
+     (throw 'message-read-bad-structure
+            "Could not read message from structure"
+            anything-else))))
+
+(define (read-message-from-string message-str)
+  "Read message from MESSAGE-STR"
+  (with-input-from-string message-str
+    (lambda ()
+      (read-message (current-input-port)))))