github.com/lazyledger/lazyledger-core@v0.35.0-dev.0.20210613111200-4c651f053571/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) 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. Reading one byte at a 76 // time is extremely slow, but this is what Amino did already, and the caller can 77 // wrap the reader in bufio.Reader if appropriate. 78 type byteReader struct { 79 io.Reader 80 bytes []byte 81 } 82 83 func newByteReader(r io.Reader) *byteReader { 84 return &byteReader{ 85 Reader: r, 86 bytes: make([]byte, 1), 87 } 88 } 89 90 func (r *byteReader) ReadByte() (byte, error) { 91 _, err := r.Read(r.bytes) 92 if err != nil { 93 return 0, err 94 } 95 return r.bytes[0], nil 96 }