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  }