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  }