123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- package proto
- import (
- "encoding/json"
- "errors"
- "fmt"
- "reflect"
- )
- func unpack(buffer []byte, msgIn Message) (msg Message, err error) {
- var env Envelope
- if err = json.Unmarshal(buffer, &env); err != nil {
- return
- }
- if msgIn == nil {
- t, ok := TypeMap[env.Type]
- if !ok {
- err = errors.New(fmt.Sprintf("Unsupposted message type %s", env.Type))
- return
- }
- // guess type
- msg = reflect.New(t).Interface().(Message)
- msg.SetType(env.Type)
- } else {
- msg = msgIn
- }
- err = json.Unmarshal(env.Payload, &msg)
- return
- }
- func UnpackInto(buffer []byte, msg Message) (err error) {
- _, err = unpack(buffer, msg)
- return
- }
- func Unpack(buffer []byte) (msg Message, err error) {
- return unpack(buffer, nil)
- }
- func Pack(payload interface{}) ([]byte, error) {
- return json.Marshal(struct {
- Version string
- Type string
- Payload interface{}
- }{
- Version: Version,
- Type: reflect.TypeOf(payload).Elem().Name(),
- Payload: payload,
- })
- }
|