89 lines
2.1 KiB
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
|
||
|
}
|