cml04-eventer/marshal.go

89 lines
2.1 KiB
Go

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
}