From 425da65ed46061303604610bb539d6495b2b1f3f Mon Sep 17 00:00:00 2001 From: anon5 Date: Mon, 21 Jun 2021 18:47:26 +0000 Subject: Add high-level protocol (de)serialization --- zerialize.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 zerialize.go (limited to 'zerialize.go') diff --git a/zerialize.go b/zerialize.go new file mode 100644 index 0000000..0e07bec --- /dev/null +++ b/zerialize.go @@ -0,0 +1,56 @@ +// This file is called zerialize.go so the following go:generate runs last. + +//go:generate ./mkserialize.sh + +package mt + +import ( + "encoding/binary" + "errors" + "io" +) + +// ErrTooLong reports a length that is too long to serialize. +var ErrTooLong = errors.New("len too long") + +var be = binary.BigEndian + +type serializer interface { + serialize(w io.Writer) +} + +func serialize(w io.Writer, s interface{}) error { + return pcall(func() { s.(serializer).serialize(w) }) +} + +type deserializer interface { + deserialize(r io.Reader) +} + +func deserialize(r io.Reader, d interface{}) error { + return pcall(func() { d.(deserializer).deserialize(r) }) +} + +type serializationError struct { + error +} + +func pcall(f func()) (rerr error) { + defer func() { + switch r := recover().(type) { + case serializationError: + rerr = r.error + case nil: + default: + panic(r) + } + }() + f() + return +} + +func chk(err error) { + if err != nil { + panic(serializationError{err}) + } +} -- cgit v1.2.3