From 901cd5beeeaf385769bc7080f837722aaed8861d Mon Sep 17 00:00:00 2001 From: Milo Date: Fri, 31 Jan 2020 23:30:38 -0500 Subject: [PATCH] some serializers --- msg.rkt | 55 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/msg.rkt b/msg.rkt index d064eff..0f12a53 100644 --- a/msg.rkt +++ b/msg.rkt @@ -43,16 +43,6 @@ ;; networks : [Listof [List Subnet IP]] #:transparent) -;; Msg -> String -(define (msg-type m) - (cond - [(msg:update? m) "update"] - [(msg:revoke? m) "revoke"] - [(msg:data? m) "data"] - [(msg:no-route? m) "no route"] - [(msg:dump? m) "dump"] - [(msg:table? m) "table"])) - ;; Any -> Msg (define (jsexpr->msg j) (define src (string->ip (hash-ref j 'src))) @@ -93,7 +83,52 @@ (define (bytes->msg bs) (jsexpr->msg (bytes->jsexpr bs))) +;; Msg -> String +(define (msg-type m) + (cond + [(msg:update? m) "update"] + [(msg:revoke? m) "revoke"] + [(msg:data? m) "data"] + [(msg:no-route? m) "no route"] + [(msg:dump? m) "dump"] + [(msg:table? m) "table"])) + +;; Msg -> Any +(define (msg->jsexpr msg) + (hash 'src (ip->string (msg-src msg)) + 'dst (ip->string (msg-dst msg)) + 'type (msg-type msg) + 'msg (match msg + [(msg:data _ _ data) data] + [(msg:no-route _ _) (hash)] + [_ (error 'msg->jsexpr + (format "unimplemented ~a" (msg-type msg)))]))) + +;; Msg -> Bytes +(define (msg->bytes msg) + (jsexpr->bytes (msg->jsexpr msg))) + (module+ test + #; + (check-equal? (msg->jsexpr + (msg:update + (string->ip "1.2.3.4") + (string->ip "1.2.3.7") + (route (subnet (string->ip "1.2.3.5") 7) + 100 + #t + '(1 2) + 'UNK))) + (hash 'src "1.2.3.4" + 'dst "1.2.3.7" + 'type "update" + 'msg (hash 'network "1.2.3.5" + 'netmask "255.255.255.128" + 'localpref 100 + 'selfOrigin #t + 'ASPath '(1 2) + 'origin "UNK"))) + (check-equal? (jsexpr->msg (hash 'src "1.2.3.4" 'dst "1.2.3.7"