summaryrefslogtreecommitdiff
path: root/zerialize.go
diff options
context:
space:
mode:
Diffstat (limited to 'zerialize.go')
-rw-r--r--zerialize.go56
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})
+ }
+}