route/vendor/github.com/asdine/storm/codec/protobuf/protobuf.go

44 lines
1.1 KiB
Go

// Package protobuf contains a codec to encode and decode entities in Protocol Buffer
package protobuf
import (
"errors"
"github.com/asdine/storm/codec/json"
"github.com/golang/protobuf/proto"
)
const name = "protobuf"
// More details on Protocol Buffers https://github.com/golang/protobuf
var (
Codec = new(protobufCodec)
errNotProtocolBufferMessage = errors.New("value isn't a Protocol Buffers Message")
)
type protobufCodec int
// Encode value with protocol buffer.
// If type isn't a Protocol buffer Message, gob encoder will be used instead.
func (c protobufCodec) Marshal(v interface{}) ([]byte, error) {
message, ok := v.(proto.Message)
if !ok {
// toBytes() may need to encode non-protobuf type, if that occurs use json
return json.Codec.Marshal(v)
}
return proto.Marshal(message)
}
func (c protobufCodec) Unmarshal(b []byte, v interface{}) error {
message, ok := v.(proto.Message)
if !ok {
// toBytes() may have encoded non-protobuf type, if that occurs use json
return json.Codec.Unmarshal(b, v)
}
return proto.Unmarshal(b, message)
}
func (c protobufCodec) Name() string {
return name
}