bitbucket.org/number571/tendermint@v0.8.14/internal/libs/protoio/io.go (about) 1 // Protocol Buffers for Go with Gadgets 2 // 3 // Copyright (c) 2013, The GoGo Authors. All rights reserved. 4 // http://github.com/gogo/protobuf 5 // 6 // Redistribution and use in source and binary forms, with or without 7 // modification, are permitted provided that the following conditions are 8 // met: 9 // 10 // * Redistributions of source code must retain the above copyright 11 // notice, this list of conditions and the following disclaimer. 12 // * Redistributions in binary form must reproduce the above 13 // copyright notice, this list of conditions and the following disclaimer 14 // in the documentation and/or other materials provided with the 15 // distribution. 16 // 17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 // 29 // Modified to return number of bytes written by Writer.WriteMsg(), and added byteReader. 30 31 package protoio 32 33 import ( 34 "io" 35 36 "github.com/gogo/protobuf/proto" 37 ) 38 39 type Writer interface { 40 WriteMsg(proto.Message) (int, error) 41 } 42 43 type WriteCloser interface { 44 Writer 45 io.Closer 46 } 47 48 type Reader interface { 49 ReadMsg(msg proto.Message) (int, error) 50 } 51 52 type ReadCloser interface { 53 Reader 54 io.Closer 55 } 56 57 type marshaler interface { 58 MarshalTo(data []byte) (n int, err error) 59 } 60 61 func getSize(v interface{}) (int, bool) { 62 if sz, ok := v.(interface { 63 Size() (n int) 64 }); ok { 65 return sz.Size(), true 66 } else if sz, ok := v.(interface { 67 ProtoSize() (n int) 68 }); ok { 69 return sz.ProtoSize(), true 70 } else { 71 return 0, false 72 } 73 } 74 75 // byteReader wraps an io.Reader and implements io.ByteReader, required by 76 // binary.ReadUvarint(). Reading one byte at a time is extremely slow, but this 77 // is what Amino did previously anyway, and the caller can wrap the underlying 78 // reader in a bufio.Reader if appropriate. 79 type byteReader struct { 80 reader io.Reader 81 buf []byte 82 bytesRead int // keeps track of bytes read via ReadByte() 83 } 84 85 func newByteReader(r io.Reader) *byteReader { 86 return &byteReader{ 87 reader: r, 88 buf: make([]byte, 1), 89 } 90 } 91 92 func (r *byteReader) ReadByte() (byte, error) { 93 n, err := r.reader.Read(r.buf) 94 r.bytesRead += n 95 if err != nil { 96 return 0x00, err 97 } 98 return r.buf[0], nil 99 }