github.com/supragya/TendermintConnector@v0.0.0-20210619045051-113e32b84fb1/_deprecated_chains/cosmos/libs/common/io.go (about) 1 package common 2 3 import ( 4 "bytes" 5 "errors" 6 "io" 7 ) 8 9 type PrefixedReader struct { 10 Prefix []byte 11 reader io.Reader 12 } 13 14 func NewPrefixedReader(prefix []byte, reader io.Reader) *PrefixedReader { 15 return &PrefixedReader{prefix, reader} 16 } 17 18 func (pr *PrefixedReader) Read(p []byte) (n int, err error) { 19 if len(pr.Prefix) > 0 { 20 read := copy(p, pr.Prefix) 21 pr.Prefix = pr.Prefix[read:] 22 return read, nil 23 } 24 return pr.reader.Read(p) 25 } 26 27 // NOTE: Not goroutine safe 28 type BufferCloser struct { 29 bytes.Buffer 30 Closed bool 31 } 32 33 func NewBufferCloser(buf []byte) *BufferCloser { 34 return &BufferCloser{ 35 *bytes.NewBuffer(buf), 36 false, 37 } 38 } 39 40 func (bc *BufferCloser) Close() error { 41 if bc.Closed { 42 return errors.New("BufferCloser already closed") 43 } 44 bc.Closed = true 45 return nil 46 } 47 48 func (bc *BufferCloser) Write(p []byte) (n int, err error) { 49 if bc.Closed { 50 return 0, errors.New("Cannot write to closed BufferCloser") 51 } 52 return bc.Buffer.Write(p) 53 } 54 55 func (bc *BufferCloser) WriteByte(c byte) error { 56 if bc.Closed { 57 return errors.New("Cannot write to closed BufferCloser") 58 } 59 return bc.Buffer.WriteByte(c) 60 } 61 62 func (bc *BufferCloser) WriteRune(r rune) (n int, err error) { 63 if bc.Closed { 64 return 0, errors.New("Cannot write to closed BufferCloser") 65 } 66 return bc.Buffer.WriteRune(r) 67 } 68 69 func (bc *BufferCloser) WriteString(s string) (n int, err error) { 70 if bc.Closed { 71 return 0, errors.New("Cannot write to closed BufferCloser") 72 } 73 return bc.Buffer.WriteString(s) 74 }