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 }