pack.go 958 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package proto
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "reflect"
  7. )
  8. func unpack(buffer []byte, msgIn Message) (msg Message, err error) {
  9. var env Envelope
  10. if err = json.Unmarshal(buffer, &env); err != nil {
  11. return
  12. }
  13. if msgIn == nil {
  14. t, ok := TypeMap[env.Type]
  15. if !ok {
  16. err = errors.New(fmt.Sprintf("Unsupposted message type %s", env.Type))
  17. return
  18. }
  19. // guess type
  20. msg = reflect.New(t).Interface().(Message)
  21. msg.SetType(env.Type)
  22. } else {
  23. msg = msgIn
  24. }
  25. err = json.Unmarshal(env.Payload, &msg)
  26. return
  27. }
  28. func UnpackInto(buffer []byte, msg Message) (err error) {
  29. _, err = unpack(buffer, msg)
  30. return
  31. }
  32. func Unpack(buffer []byte) (msg Message, err error) {
  33. return unpack(buffer, nil)
  34. }
  35. func Pack(payload interface{}) ([]byte, error) {
  36. return json.Marshal(struct {
  37. Version string
  38. Type string
  39. Payload interface{}
  40. }{
  41. Version: Version,
  42. Type: reflect.TypeOf(payload).Elem().Name(),
  43. Payload: payload,
  44. })
  45. }