github.com/status-im/status-go@v1.1.0/protocol/v1/encoder.go (about) 1 package protocol 2 3 import ( 4 "errors" 5 "io" 6 "reflect" 7 8 "github.com/russolsen/transit" 9 ) 10 11 var ( 12 pairMessageType = reflect.TypeOf(PairMessage{}) 13 14 defaultMessageValueEncoder = &messageValueEncoder{} 15 ) 16 17 // NewMessageEncoder returns a new Transit encoder 18 // that can encode Message values. 19 // More about Transit: https://github.com/cognitect/transit-format 20 func NewMessageEncoder(w io.Writer) *transit.Encoder { 21 encoder := transit.NewEncoder(w, false) 22 encoder.AddHandler(pairMessageType, defaultMessageValueEncoder) 23 return encoder 24 } 25 26 type messageValueEncoder struct{} 27 28 func (messageValueEncoder) IsStringable(reflect.Value) bool { 29 return false 30 } 31 32 func (messageValueEncoder) Encode(e transit.Encoder, value reflect.Value, asString bool) error { 33 switch message := value.Interface().(type) { 34 case PairMessage: 35 taggedValue := transit.TaggedValue{ 36 Tag: pairMessageTag, 37 Value: []interface{}{ 38 message.InstallationID, 39 message.DeviceType, 40 message.Name, 41 message.FCMToken, 42 }, 43 } 44 return e.EncodeInterface(taggedValue, false) 45 } 46 47 return errors.New("unknown message type to encode") 48 }