67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
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
|
|
}
|