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 }