Initial import
This commit is contained in:
66
storage/codec/codec.go
Normal file
66
storage/codec/codec.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package codec
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
)
|
||||
|
||||
type Codec interface {
|
||||
Type() string
|
||||
Encode(any) ([]byte, error)
|
||||
Decode([]byte, any) error
|
||||
}
|
||||
|
||||
type Stream interface {
|
||||
Encode(any) error
|
||||
Decode(any) error
|
||||
}
|
||||
|
||||
var (
|
||||
codecs = make(map[string]func() Codec)
|
||||
streams = make(map[string]func(io.Reader, io.Writer) Stream)
|
||||
)
|
||||
|
||||
func Register(name string, create func() Codec) {
|
||||
if _, dupe := codecs[name]; dupe {
|
||||
panic(fmt.Sprintf("codec: duplicate codec %q registered", name))
|
||||
}
|
||||
codecs[name] = create
|
||||
}
|
||||
|
||||
func New(name string) (Codec, error) {
|
||||
if f, ok := codecs[name]; ok {
|
||||
return f(), nil
|
||||
}
|
||||
return nil, fmt.Errorf("codec: no %q codec registered", name)
|
||||
}
|
||||
|
||||
func Must(name string) Codec {
|
||||
c, err := New(name)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
func RegisterStream(name string, create func(io.Reader, io.Writer) Stream) {
|
||||
if _, dupe := streams[name]; dupe {
|
||||
panic(fmt.Sprintf("codec: duplicate stream %q registered", name))
|
||||
}
|
||||
streams[name] = create
|
||||
}
|
||||
|
||||
func NewStream(name string, r io.Reader, w io.Writer) (Stream, error) {
|
||||
if f, ok := streams[name]; ok {
|
||||
return f(r, w), nil
|
||||
}
|
||||
return nil, fmt.Errorf("codec: no %q stream registered", name)
|
||||
}
|
||||
|
||||
func MustStream(name string, r io.Reader, w io.Writer) Stream {
|
||||
s, err := NewStream(name, r, w)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return s
|
||||
}
|
Reference in New Issue
Block a user