]> git.lizzy.rs Git - mt.git/blob - zerialize.go
Add WaitGroup to SerializePkt
[mt.git] / zerialize.go
1 // This file is called zerialize.go so the following go:generate runs last.
2
3 //go:generate ./mkserialize.sh
4
5 package mt
6
7 import (
8         "encoding/binary"
9         "errors"
10         "io"
11 )
12
13 // ErrTooLong reports a length that is too long to serialize.
14 var ErrTooLong = errors.New("len too long")
15
16 var be = binary.BigEndian
17
18 type serializer interface {
19         Serialize(w io.Writer)
20 }
21
22 func serialize(w io.Writer, s interface{}) error {
23         return pcall(func() { s.(serializer).Serialize(w) })
24 }
25
26 type deserializer interface {
27         Deserialize(r io.Reader)
28 }
29
30 func deserialize(r io.Reader, d interface{}) error {
31         return pcall(func() { d.(deserializer).Deserialize(r) })
32 }
33
34 type serializationError struct {
35         error
36 }
37
38 func pcall(f func()) (rerr error) {
39         defer func() {
40                 switch r := recover().(type) {
41                 case serializationError:
42                         rerr = r.error
43                 case nil:
44                 default:
45                         panic(r)
46                 }
47         }()
48         f()
49         return
50 }
51
52 func chk(err error) {
53         if err != nil {
54                 panic(serializationError{err})
55         }
56 }