OSDN Git Service

new repo
[bytom/vapor.git] / vendor / github.com / tendermint / tmlibs / common / io.go
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         } else {
24                 return pr.reader.Read(p)
25         }
26 }
27
28 // NOTE: Not goroutine safe
29 type BufferCloser struct {
30         bytes.Buffer
31         Closed bool
32 }
33
34 func NewBufferCloser(buf []byte) *BufferCloser {
35         return &BufferCloser{
36                 *bytes.NewBuffer(buf),
37                 false,
38         }
39 }
40
41 func (bc *BufferCloser) Close() error {
42         if bc.Closed {
43                 return errors.New("BufferCloser already closed")
44         }
45         bc.Closed = true
46         return nil
47 }
48
49 func (bc *BufferCloser) Write(p []byte) (n int, err error) {
50         if bc.Closed {
51                 return 0, errors.New("Cannot write to closed BufferCloser")
52         }
53         return bc.Buffer.Write(p)
54 }
55
56 func (bc *BufferCloser) WriteByte(c byte) error {
57         if bc.Closed {
58                 return errors.New("Cannot write to closed BufferCloser")
59         }
60         return bc.Buffer.WriteByte(c)
61 }
62
63 func (bc *BufferCloser) WriteRune(r rune) (n int, err error) {
64         if bc.Closed {
65                 return 0, errors.New("Cannot write to closed BufferCloser")
66         }
67         return bc.Buffer.WriteRune(r)
68 }
69
70 func (bc *BufferCloser) WriteString(s string) (n int, err error) {
71         if bc.Closed {
72                 return 0, errors.New("Cannot write to closed BufferCloser")
73         }
74         return bc.Buffer.WriteString(s)
75 }