diff options
Diffstat (limited to 'zerialize.go')
-rw-r--r-- | zerialize.go | 56 |
1 files changed, 56 insertions, 0 deletions
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}) + } +} |