github.com/ooni/psiphon/tunnel-core@v0.0.0-20230105123940-fe12a24c96ee/oovendor/quic-go/quicvarint/io.go (about)

     1  package quicvarint
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  )
     7  
     8  // Reader implements both the io.ByteReader and io.Reader interfaces.
     9  type Reader interface {
    10  	io.ByteReader
    11  	io.Reader
    12  }
    13  
    14  var _ Reader = &bytes.Reader{}
    15  
    16  type byteReader struct {
    17  	io.Reader
    18  }
    19  
    20  var _ Reader = &byteReader{}
    21  
    22  // NewReader returns a Reader for r.
    23  // If r already implements both io.ByteReader and io.Reader, NewReader returns r.
    24  // Otherwise, r is wrapped to add the missing interfaces.
    25  func NewReader(r io.Reader) Reader {
    26  	if r, ok := r.(Reader); ok {
    27  		return r
    28  	}
    29  	return &byteReader{r}
    30  }
    31  
    32  func (r *byteReader) ReadByte() (byte, error) {
    33  	var b [1]byte
    34  	_, err := r.Reader.Read(b[:])
    35  	return b[0], err
    36  }
    37  
    38  // Writer implements both the io.ByteWriter and io.Writer interfaces.
    39  type Writer interface {
    40  	io.ByteWriter
    41  	io.Writer
    42  }
    43  
    44  var _ Writer = &bytes.Buffer{}
    45  
    46  type byteWriter struct {
    47  	io.Writer
    48  }
    49  
    50  var _ Writer = &byteWriter{}
    51  
    52  // NewWriter returns a Writer for w.
    53  // If r already implements both io.ByteWriter and io.Writer, NewWriter returns w.
    54  // Otherwise, w is wrapped to add the missing interfaces.
    55  func NewWriter(w io.Writer) Writer {
    56  	if w, ok := w.(Writer); ok {
    57  		return w
    58  	}
    59  	return &byteWriter{w}
    60  }
    61  
    62  func (w *byteWriter) WriteByte(c byte) error {
    63  	_, err := w.Writer.Write([]byte{c})
    64  	return err
    65  }