830ff6bae1e78a9160a568bb80ca5944ae1c8b95
[svn42.git] / go / r3events / marshal_events.go
1 // (c) Bernhard Tittelbach, 2013
2
3 package r3events
4
5 import (
6     "encoding/json"
7     "fmt"
8     "errors"
9     "strings"
10     )
11
12 func NameOfStruct(evi interface{}) (name string) {
13     etype := fmt.Sprintf("%T", evi)
14     etype_lastsep := strings.LastIndex(etype,".")
15     return etype[etype_lastsep+1:] //works in all cases for etype_lastsep in range -1 to len(etype)-1
16 }
17
18 func MarshalEvent2ByteByte(event_interface interface{}) (data [][]byte, err error) {
19     var msg []byte
20     //~ fmt.Printf("%T%+v\n", event_interface, event_interface)
21         msg, err = json.Marshal(event_interface)
22         if err != nil {
23                 return
24         }
25     data = [][]byte{[]byte(NameOfStruct(event_interface)), msg} //works in all cases for etype_lastsep in range -1 to len(etype)-1
26     return
27 }
28
29 func UnmarshalByteByte2Event(data [][]byte) (event interface{}, category string, err error) {
30     if len(data) != 2 {
31         return nil, "", errors.New("not a r3event message")
32     }
33     switch string(data[0]) {
34         case "DoorLockUpdate":
35             event = DoorLockUpdate{}
36             err = json.Unmarshal(data[1],&event)
37             category = "door"
38         case "DoorAjarUpdate":
39             event := DoorAjarUpdate{}
40             err = json.Unmarshal(data[1], &event)
41             category = "door"
42         case "BackdoorAjarUpdate":
43             event := DoorAjarUpdate{}
44             err = json.Unmarshal(data[1], &event)
45             category = "door"
46         case "DoorCommandEvent":
47             event := DoorCommandEvent{}
48             err = json.Unmarshal(data[1], &event)
49             category = "door"
50         case "DoorProblemEvent":
51             event := DoorProblemEvent{}
52             err = json.Unmarshal(data[1], &event)
53             category = "door"
54         case "BoreDoomButtonPressEvent":
55             event := BoreDoomButtonPressEvent{}
56             err = json.Unmarshal(data[1], &event)
57             category = "buttons"
58         case "TempSensorUpdate":
59             event := TempSensorUpdate{}
60             err = json.Unmarshal(data[1], &event)
61             category = "sensors"
62         case "IlluminationSensorUpdate":
63             event := IlluminationSensorUpdate{}
64             err = json.Unmarshal(data[1], &event)
65             category = "sensors"
66         case "TimeTick":
67             event := TimeTick{}
68             err = json.Unmarshal(data[1], &event)
69             category = "time"
70         case "MovementSensorUpdate":
71             event := MovementSensorUpdate{}
72             err = json.Unmarshal(data[1], &event)
73             category = "movement"
74         case "PresenceUpdate":
75             event := PresenceUpdate{}
76             err = json.Unmarshal(data[1], &event)
77             category = "presence"
78         case "SomethingReallyIsMoving":
79             event := SomethingReallyIsMoving{}
80             err = json.Unmarshal(data[1], &event)
81             category = "movement"
82         default:
83             event = nil
84             err = errors.New("cannot unmarshal unknown type")
85             category = ""
86     }
87     return
88 }