summaryrefslogtreecommitdiff
path: root/pointedthing.go
diff options
context:
space:
mode:
Diffstat (limited to 'pointedthing.go')
-rw-r--r--pointedthing.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/pointedthing.go b/pointedthing.go
new file mode 100644
index 0000000..c73130f
--- /dev/null
+++ b/pointedthing.go
@@ -0,0 +1,69 @@
+package mt
+
+import (
+ "fmt"
+ "io"
+)
+
+type PointedThing interface {
+ pt()
+}
+
+func (*PointedNode) pt() {}
+func (*PointedAO) pt() {}
+
+type PointedNode struct {
+ Under, Above [3]int16
+}
+
+func PointedSameNode(pos [3]int16) PointedThing {
+ return &PointedNode{pos, pos}
+}
+
+type PointedAO struct {
+ ID AOID
+}
+
+func writePointedThing(w io.Writer, pt PointedThing) error {
+ buf := make([]byte, 2)
+ buf[0] = 0
+ switch pt.(type) {
+ case nil:
+ buf[1] = 0
+ case *PointedNode:
+ buf[1] = 1
+ case *PointedAO:
+ buf[1] = 2
+ default:
+ panic(pt)
+ }
+ if _, err := w.Write(buf); err != nil {
+ return err
+ }
+ if pt == nil {
+ return nil
+ }
+ return serialize(w, pt)
+}
+
+func readPointedThing(r io.Reader) (PointedThing, error) {
+ buf := make([]byte, 2)
+ if _, err := io.ReadFull(r, buf); err != nil {
+ return nil, err
+ }
+ if buf[0] != 0 {
+ return nil, fmt.Errorf("unsupported PointedThing version: %d", buf[0])
+ }
+ var pt PointedThing
+ switch buf[1] {
+ case 0:
+ return nil, nil
+ case 1:
+ pt = new(PointedNode)
+ case 2:
+ pt = new(PointedAO)
+ case 3:
+ return nil, fmt.Errorf("invalid PointedThing type: %d", buf[1])
+ }
+ return pt, deserialize(r, pt)
+}