]> git.lizzy.rs Git - mt.git/blob - pointedthing.go
Add WaitGroup to SerializePkt
[mt.git] / pointedthing.go
1 package mt
2
3 import (
4         "fmt"
5         "io"
6 )
7
8 type PointedThing interface {
9         pt()
10 }
11
12 func (*PointedNode) pt() {}
13 func (*PointedAO) pt()   {}
14
15 type PointedNode struct {
16         Under, Above [3]int16
17 }
18
19 func PointedSameNode(pos [3]int16) PointedThing {
20         return &PointedNode{pos, pos}
21 }
22
23 type PointedAO struct {
24         ID AOID
25 }
26
27 func writePointedThing(w io.Writer, pt PointedThing) error {
28         buf := make([]byte, 2)
29         buf[0] = 0
30         switch pt.(type) {
31         case nil:
32                 buf[1] = 0
33         case *PointedNode:
34                 buf[1] = 1
35         case *PointedAO:
36                 buf[1] = 2
37         default:
38                 panic(pt)
39         }
40         if _, err := w.Write(buf); err != nil {
41                 return err
42         }
43         if pt == nil {
44                 return nil
45         }
46         return serialize(w, pt)
47 }
48
49 func readPointedThing(r io.Reader) (PointedThing, error) {
50         buf := make([]byte, 2)
51         if _, err := io.ReadFull(r, buf); err != nil {
52                 return nil, err
53         }
54         if buf[0] != 0 {
55                 return nil, fmt.Errorf("unsupported PointedThing version: %d", buf[0])
56         }
57         var pt PointedThing
58         switch buf[1] {
59         case 0:
60                 return nil, nil
61         case 1:
62                 pt = new(PointedNode)
63         case 2:
64                 pt = new(PointedAO)
65         case 3:
66                 return nil, fmt.Errorf("invalid PointedThing type: %d", buf[1])
67         }
68         return pt, deserialize(r, pt)
69 }