Files
3410369ad4 Chore: Update to latest Cortex (#947)
* Chore: Update to latest Cortex

* Fix typos

Signed-off-by: Michel Hollands <[email protected]>

* Use tempo prefix for dns provider registerer

Signed-off-by: Michel Hollands <[email protected]>

Co-authored-by: Michel Hollands <[email protected]>
2021-09-13 11:24:25 -04:00

70 lines
1.5 KiB
Go

package codec
import (
"github.com/gogo/protobuf/proto"
"github.com/golang/snappy"
)
// Codec allows KV clients to serialise and deserialise values.
type Codec interface {
Decode([]byte) (interface{}, error)
Encode(interface{}) ([]byte, error)
// CodecID is a short identifier to communicate what codec should be used to decode the value.
// Once in use, this should be stable to avoid confusing other clients.
CodecID() string
}
// Proto is a Codec for proto/snappy
type Proto struct {
id string
factory func() proto.Message
}
func NewProtoCodec(id string, factory func() proto.Message) Proto {
return Proto{id: id, factory: factory}
}
func (p Proto) CodecID() string {
return p.id
}
// Decode implements Codec
func (p Proto) Decode(bytes []byte) (interface{}, error) {
out := p.factory()
bytes, err := snappy.Decode(nil, bytes)
if err != nil {
return nil, err
}
if err := proto.Unmarshal(bytes, out); err != nil {
return nil, err
}
return out, nil
}
// Encode implements Codec
func (p Proto) Encode(msg interface{}) ([]byte, error) {
bytes, err := proto.Marshal(msg.(proto.Message))
if err != nil {
return nil, err
}
return snappy.Encode(nil, bytes), nil
}
// String is a code for strings.
type String struct{}
func (String) CodecID() string {
return "string"
}
// Decode implements Codec.
func (String) Decode(bytes []byte) (interface{}, error) {
return string(bytes), nil
}
// Encode implements Codec.
func (String) Encode(msg interface{}) ([]byte, error) {
return []byte(msg.(string)), nil
}