mirror of
https://github.com/hanzoai/traces.git
synced 2026-10-30 18:20:41 +00:00
* 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]>
70 lines
1.5 KiB
Go
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
|
|
}
|