more proper import
[svn42.git] / go / r3events / marshal_events.go
diff --git a/go/r3events/marshal_events.go b/go/r3events/marshal_events.go
new file mode 100644 (file)
index 0000000..830ff6b
--- /dev/null
@@ -0,0 +1,88 @@
+// (c) Bernhard Tittelbach, 2013
+
+package r3events
+
+import (
+    "encoding/json"
+    "fmt"
+    "errors"
+    "strings"
+    )
+
+func NameOfStruct(evi interface{}) (name string) {
+    etype := fmt.Sprintf("%T", evi)
+    etype_lastsep := strings.LastIndex(etype,".")
+    return etype[etype_lastsep+1:] //works in all cases for etype_lastsep in range -1 to len(etype)-1
+}
+
+func MarshalEvent2ByteByte(event_interface interface{}) (data [][]byte, err error) {
+    var msg []byte
+    //~ fmt.Printf("%T%+v\n", event_interface, event_interface)
+       msg, err = json.Marshal(event_interface)
+       if err != nil {
+               return
+       }
+    data = [][]byte{[]byte(NameOfStruct(event_interface)), msg} //works in all cases for etype_lastsep in range -1 to len(etype)-1
+    return
+}
+
+func UnmarshalByteByte2Event(data [][]byte) (event interface{}, category string, err error) {
+    if len(data) != 2 {
+        return nil, "", errors.New("not a r3event message")
+    }
+    switch string(data[0]) {
+        case "DoorLockUpdate":
+            event = DoorLockUpdate{}
+            err = json.Unmarshal(data[1],&event)
+            category = "door"
+        case "DoorAjarUpdate":
+            event := DoorAjarUpdate{}
+            err = json.Unmarshal(data[1], &event)
+            category = "door"
+        case "BackdoorAjarUpdate":
+            event := DoorAjarUpdate{}
+            err = json.Unmarshal(data[1], &event)
+            category = "door"
+        case "DoorCommandEvent":
+            event := DoorCommandEvent{}
+            err = json.Unmarshal(data[1], &event)
+            category = "door"
+        case "DoorProblemEvent":
+            event := DoorProblemEvent{}
+            err = json.Unmarshal(data[1], &event)
+            category = "door"
+        case "BoreDoomButtonPressEvent":
+            event := BoreDoomButtonPressEvent{}
+            err = json.Unmarshal(data[1], &event)
+            category = "buttons"
+        case "TempSensorUpdate":
+            event := TempSensorUpdate{}
+            err = json.Unmarshal(data[1], &event)
+            category = "sensors"
+        case "IlluminationSensorUpdate":
+            event := IlluminationSensorUpdate{}
+            err = json.Unmarshal(data[1], &event)
+            category = "sensors"
+        case "TimeTick":
+            event := TimeTick{}
+            err = json.Unmarshal(data[1], &event)
+            category = "time"
+        case "MovementSensorUpdate":
+            event := MovementSensorUpdate{}
+            err = json.Unmarshal(data[1], &event)
+            category = "movement"
+        case "PresenceUpdate":
+            event := PresenceUpdate{}
+            err = json.Unmarshal(data[1], &event)
+            category = "presence"
+        case "SomethingReallyIsMoving":
+            event := SomethingReallyIsMoving{}
+            err = json.Unmarshal(data[1], &event)
+            category = "movement"
+        default:
+            event = nil
+            err = errors.New("cannot unmarshal unknown type")
+            category = ""
+    }
+    return
+}