summaryrefslogtreecommitdiff
path: root/pointedthing.go
diff options
context:
space:
mode:
authoranon5 <anon5clam@protonmail.com>2021-06-21 18:47:26 +0000
committeranon5 <anon5clam@protonmail.com>2021-06-21 18:47:26 +0000
commit425da65ed46061303604610bb539d6495b2b1f3f (patch)
tree10ae3e665132c369ce0207676321cef870679923 /pointedthing.go
parent9f239d341ef46b656dda759020da87bdd0606344 (diff)
downloadmt-425da65ed46061303604610bb539d6495b2b1f3f.tar.xz
Add high-level protocol (de)serialization
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)
+}