package cml04eventer import ( "bytes" "encoding/gob" "encoding/json" "github.com/nsqio/go-nsq" "github.com/pkg/errors" ) type Marshaler interface { Marshal(topic string, msg *Event) ([]byte, error) } type Unmarshaler interface { Unmarshal(*nsq.Message) (*Event, error) } type JSONMarshaler struct{} func (j JSONMarshaler) Marshal(topic string, msg *Event) ([]byte, error) { // buffer holder buf := new(bytes.Buffer) // create encoder encoder := json.NewEncoder(buf) // encode message if err := encoder.Encode(msg); err != nil { return nil, errors.Wrap(err, "cannot encode message") } // return encoded message return buf.Bytes(), nil } func (j JSONMarshaler) Unmarshal(nsqMsg *nsq.Message) (*Event, error) { // buffer holder buf := new(bytes.Buffer) // write message data to buffer _, err := buf.Write(nsqMsg.Body) if err != nil { return nil, errors.Wrap(err, "cannot write nsq message data to buffer") } // create decoder decoder := json.NewDecoder(buf) // decode event from buffer message var decodedEvent Event // decode message if err := decoder.Decode(&decodedEvent); err != nil { return nil, errors.Wrap(err, "cannot decode message") } // return decoded message return &decodedEvent, nil } type GobMarshaler struct{} func (g GobMarshaler) Marshal(topic string, msg *Event) ([]byte, error) { // buffer holder buf := new(bytes.Buffer) // create encoder encoder := gob.NewEncoder(buf) // encode message if err := encoder.Encode(msg); err != nil { return nil, errors.Wrap(err, "cannot encode message") } // return encoded message return buf.Bytes(), nil } func (g GobMarshaler) Unmarshal(nsqMsg *nsq.Message) (*Event, error) { // buffer holder buf := new(bytes.Buffer) // write message data to buffer _, err := buf.Write(nsqMsg.Body) if err != nil { return nil, errors.Wrap(err, "cannot write nsq message data to buffer") } // create decoder decoder := gob.NewDecoder(buf) // decode event from buffer message var decodedEvent Event // decode message if err := decoder.Decode(&decodedEvent); err != nil { return nil, errors.Wrap(err, "cannot decode message") } // return decoded message return &decodedEvent, nil }