ipld-eth-server/vendor/github.com/multiformats/go-multicodec/multicodec.go

71 lines
1021 B
Go

package multicodec
import "io"
// Multicodec is the interface for a multicodec
type Multicodec interface {
Codec
Header() []byte
}
type c2mc struct {
c Codec
header []byte
}
var _ Multicodec = (*c2mc)(nil)
func (c c2mc) Header() []byte {
return c.header
}
type c2mcD struct {
base *c2mc
r io.Reader
}
func (d c2mcD) Decode(v interface{}) error {
err := ConsumeHeader(d.r, d.base.header)
if err != nil {
return err
}
return d.base.c.Decoder(d.r).Decode(v)
}
var _ Decoder = (*c2mcD)(nil)
func (c c2mc) Decoder(r io.Reader) Decoder {
return c2mcD{
base: &c,
r: r,
}
}
type c2mcE struct {
base *c2mc
w io.Writer
}
func (e c2mcE) Encode(v interface{}) error {
_, err := e.w.Write(e.base.Header())
if err != nil {
return err
}
return e.base.c.Encoder(e.w).Encode(v)
}
func (c c2mc) Encoder(w io.Writer) Encoder {
return c2mcE{
base: &c,
w: w,
}
}
func NewMulticodecFromCodec(c Codec, header []byte) Multicodec {
return c2mc{
c: c,
header: header,
}
}