src.dualinventive.com/innovation/go-dinetrpc-pb/codec_json.go

153 lines
4.0 KiB
Go

package dinetrpc
import (
"fmt"
"encoding/json"
)
func (msg *Msg) UnmarshalJSON(b []byte) error {
hdr := &HeaderMsg{}
if err := json.Unmarshal(b, hdr); err != nil {
return err
}
msg.HeaderMsg = hdr
var classMethod string
var msgType MsgType
if msg.Pub != "" {
classMethod = msg.Pub
msgType = MsgType_Publish
} else if msg.Req != "" {
classMethod = msg.Req
msgType = MsgType_Request
} else if msg.Rep != "" {
classMethod = msg.Rep
msgType = MsgType_Reply
// TODO attach error
//if err := json.Unmarshal(b, msg.Error); err != nil {
// return err
//}
} else {
return fmt.Errorf("unknown")
}
msg.Type = msgType
msg.ClassMethod = ClassMethodFromJSONString(classMethod)
// No need to decode result for requests
if msg.Type == MsgType_Request {
return nil
}
if msg.ClassMethod == ClassMethod_SensorData {
sensorDataResult := &SensorDataResult{}
if err := json.Unmarshal(b, sensorDataResult); err != nil {
return err
}
msg.Result = &Msg_SensorDataResult{SensorDataResult: sensorDataResult}
} else if msg.ClassMethod == ClassMethod_DeviceData {
deviceDataResult := &DeviceDataResult{}
if err := json.Unmarshal(b, deviceDataResult); err != nil {
return err
}
msg.Result = &Msg_DeviceDataResult{DeviceDataResult: deviceDataResult}
} else if msg.ClassMethod == ClassMethod_DeviceInfo {
deviceInfoResult := &DeviceInfoResult{}
if err := json.Unmarshal(b, deviceInfoResult); err != nil {
return err
}
msg.Result = &Msg_DeviceInfoResult{DeviceInfoResult: deviceInfoResult}
} else if msg.ClassMethod == ClassMethod_SensorInfo {
sensorInfoResult := &SensorInfoResult{}
if err := json.Unmarshal(b, sensorInfoResult); err != nil {
return err
}
msg.Result = &Msg_SensorInfoResult{SensorInfoResult: sensorInfoResult}
} else if msg.ClassMethod == ClassMethod_ConfigInfo {
configInfoResult := &ConfigInfoResult{}
if err := json.Unmarshal(b, configInfoResult); err != nil {
return err
}
msg.Result = &Msg_ConfigInfoResult{ConfigInfoResult: configInfoResult}
} else if msg.ClassMethod == ClassMethod_ActionInfo {
actionInfoResult := &ActionInfoResult{}
if err := json.Unmarshal(b, actionInfoResult); err != nil {
return err
}
msg.Result = &Msg_ActionInfoResult{ActionInfoResult: actionInfoResult}
} else if msg.ClassMethod == ClassMethod_ConnectionInfo {
connectionInfoResult := &ConnectionInfoResult{}
if err := json.Unmarshal(b, connectionInfoResult); err != nil {
return err
}
msg.Result = &Msg_ConnectionInfoResult{ConnectionInfoResult: connectionInfoResult}
}
return nil
}
func (cm ClassMethod) MarshalJSON() ([]byte, error) {
name, ok := ClassMethod_JSON_name[int32(cm)]
if !ok {
name = ClassMethod_JSON_name[int32(ClassMethod_UnknownUnknown)]
}
return json.Marshal(name)
}
func (cm *ClassMethod) UnmarshalJSON(b []byte) error {
var name string
if err := json.Unmarshal(b, &name); err != nil {
return err
}
*cm = ClassMethodFromJSONString(name)
return nil
}
func (v *Value) UnmarshalJSON(b []byte) error {
var jv interface{}
if err := json.Unmarshal(b, &jv); err != nil {
return err
}
switch value := jv.(type) {
case string:
v.Value = &Value_String_{String_: value}
case int, int8, int16, int32, int64:
v.Value = &Value_Number{Number: float64(value.(int64))}
case uint, uint8, uint16, uint32, uint64:
v.Value = &Value_Number{Number: float64(value.(uint64))}
case float32, float64:
v.Value = &Value_Number{Number: float64(value.(float64))}
case bool:
v.Value = &Value_Bool{Bool: value}
case map[string]interface{}:
gps := &GPSValue{}
if err := json.Unmarshal(b, &gps); err != nil {
return err
}
v.Value = &Value_GPS{GPS: gps}
return nil
default:
return fmt.Errorf("unsupported value type")
}
return nil
}
func (v *Value) MarshalJSON() ([]byte, error) {
var value interface{}
if x, ok := v.GetValue().(*Value_Bool); ok {
value = x.Bool
} else if x, ok := v.GetValue().(*Value_Number); ok {
value = x.Number
} else if x, ok := v.GetValue().(*Value_String_); ok {
value = x.String_
}
return json.Marshal(value)
}