X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=8sync%2Fsystems%2Factors.scm;h=bd164be2c26199e1f2fa1a6730085dddd162e777;hb=6f1b55de9d8438adb6984f52753e8eea2ca9df27;hp=8f15feb8b9046258968039eb338d8a79953f3e1a;hpb=70b92d795a14d1328b90dd06f8c618b2ea09332d;p=8sync.git
diff --git a/8sync/systems/actors.scm b/8sync/systems/actors.scm
index 8f15feb..bd164be 100644
--- a/8sync/systems/actors.scm
+++ b/8sync/systems/actors.scm
@@ -24,6 +24,7 @@
#:use-module (srfi srfi-9 gnu)
#:use-module (ice-9 format)
#:use-module (ice-9 match)
+ #:use-module (ice-9 pretty-print)
#:use-module (8sync agenda)
#:use-module (8sync repl)
#:export (;; utilities... ought to go in their own module
@@ -37,7 +38,9 @@
actor-hive
actor-message-handler
-
+ ;;; Commenting out the type for now;
+ ;;; it may be back when we have better serializers
+ ;;
make-address address?
address-actor-id address-hive-id
@@ -107,7 +110,7 @@
;;; =========================
(define-class ()
- ;; An object
+ ;; An address object
(id #:init-thunk (require-slot "id")
#:init-keyword #:id
#:getter actor-id)
@@ -123,16 +126,31 @@
(define-method (actor-message-handler (actor ))
(slot-ref actor 'message-handler))
-(define-record-type
- (make-address actor-id hive-id) ; @@: Do we want the trailing -id?
- address?
- (actor-id address-actor-id)
- (hive-id address-hive-id))
+;;; So these are the nicer representations of addresses.
+;;; However, they don't serialize so easily with scheme read/write, so we're
+;;; using the simpler cons cell version below for now.
+;; (define-record-type
+;; (make-address actor-id hive-id) ; @@: Do we want the trailing -id?
+;; address?
+;; (actor-id address-actor-id)
+;; (hive-id address-hive-id))
+;;
;; (set-record-type-printer!
;;
;; (lambda (record port)
-;; (format port "< ~s>" (address->string record))))
+;; (format port ""
+;; (address-actor-id record) (address-hive-id record))))
+;;
+
+(define (make-address actor-id hive-id)
+ (cons actor-id hive-id))
+
+(define (address-actor-id address)
+ (car address))
+
+(define (address-hive-id address)
+ (cdr address))
(define (address->string address)
(string-append (address-actor-id address) "@"
@@ -423,7 +441,7 @@ Instead, actors should call create-actor."
;; Requiring mutation on message objects is clearly not great,
;; but it may be worth it...? Investigate!
(replied message-replied set-message-replied!)
- (deferred-reply deferred-reply set-message-deferred-reply!))
+ (deferred-reply message-deferred-reply set-message-deferred-reply!))
(define* (make-message id to from action body
@@ -540,3 +558,64 @@ an integer."
(define (hive-bootstrap-message hive to-id action . message-body-args)
(wrap
(apply send-message hive to-id action message-body-args)))
+
+
+
+;;; Convenience procedures
+;;; ======================
+
+(define (serialize-message message)
+ "Serialize a message for read/write"
+ (list
+ (message-id message)
+ (address->string (message-to message))
+ (address->string (message-from message))
+ (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 #: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
+Guile's `read' procedure knows how to read, this doesn't do anything
+to improve that. You'll need a better serializer for that.."
+ (write (serialize-message message) port))
+
+(define (serialize-message-pretty message)
+ "Serialize a message in a way that's easy for humans to read."
+ `(*message*
+ (id ,(message-id message))
+ (to ,(message-to message))
+ (from ,(message-from message))
+ (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)))))