github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/p2p/p2putil/multicodec_old/multicodec.go (about) 1 package multicodec 2 3 import "io" 4 5 // Multicodec is the interface for a multicodec 6 type Multicodec interface { 7 Codec 8 9 Header() []byte 10 } 11 12 type c2mc struct { 13 c Codec 14 header []byte 15 } 16 17 var _ Multicodec = (*c2mc)(nil) 18 19 func (c c2mc) Header() []byte { 20 return c.header 21 } 22 23 type c2mcD struct { 24 base *c2mc 25 r io.Reader 26 } 27 28 func (d c2mcD) Decode(v interface{}) error { 29 err := ConsumeHeader(d.r, d.base.header) 30 if err != nil { 31 return err 32 } 33 return d.base.c.Decoder(d.r).Decode(v) 34 } 35 36 var _ Decoder = (*c2mcD)(nil) 37 38 func (c c2mc) Decoder(r io.Reader) Decoder { 39 return c2mcD{ 40 base: &c, 41 r: r, 42 } 43 } 44 45 type c2mcE struct { 46 base *c2mc 47 w io.Writer 48 } 49 50 func (e c2mcE) Encode(v interface{}) error { 51 _, err := e.w.Write(e.base.Header()) 52 if err != nil { 53 return err 54 } 55 return e.base.c.Encoder(e.w).Encode(v) 56 } 57 58 func (c c2mc) Encoder(w io.Writer) Encoder { 59 return c2mcE{ 60 base: &c, 61 w: w, 62 } 63 }