041452c80044ed6d516839656cc2c7c368857fbe
[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 "DustSensorUpdate":
67             event := DustSensorUpdate{}
68             err = json.Unmarshal(data[1], &event)
69             category = "sensors"
70         case "RelativeHumiditySensorUpdate":
71             event := RelativeHumiditySensorUpdate{}
72             err = json.Unmarshal(data[1], &event)
73             category = "sensors"
74         case "TimeTick":
75             event := TimeTick{}
76             err = json.Unmarshal(data[1], &event)
77             category = "time"
78         case "MovementSensorUpdate":
79             event := MovementSensorUpdate{}
80             err = json.Unmarshal(data[1], &event)
81             category = "movement"
82         case "PresenceUpdate":
83             event := PresenceUpdate{}
84             err = json.Unmarshal(data[1], &event)
85             category = "presence"
86         case "SomethingReallyIsMoving":
87             event := SomethingReallyIsMoving{}
88             err = json.Unmarshal(data[1], &event)
89             category = "movement"
90         case "NetDHCPACK":
91             event := NetDHCPACK{}
92             err = json.Unmarshal(data[1], &event)
93             category = "network"
94         case "NetGWStatUpdate":
95             event := NetGWStatUpdate{}
96             err = json.Unmarshal(data[1], &event)
97             category = "network"
98         default:
99             event = nil
100             err = errors.New("cannot unmarshal unknown type")
101             category = ""
102     }
103     return
104 }