github.com/jhump/protoreflect@v1.16.0/codec/codec.go (about)

     1  package codec
     2  
     3  import (
     4  	"io"
     5  
     6  	"github.com/golang/protobuf/proto"
     7  
     8  	"github.com/jhump/protoreflect/internal/codec"
     9  )
    10  
    11  // ErrOverflow is returned when an integer is too large to be represented.
    12  var ErrOverflow = codec.ErrOverflow
    13  
    14  // ErrBadWireType is returned when decoding a wire-type from a buffer that
    15  // is not valid.
    16  var ErrBadWireType = codec.ErrBadWireType
    17  
    18  // NB: much of the implementation is in an internal package, to avoid an import
    19  // cycle between this codec package and the desc package. We export it from
    20  // this package, but we can't use a type alias because we also need to add
    21  // methods to it, to broaden the exposed API.
    22  
    23  // Buffer is a reader and a writer that wraps a slice of bytes and also
    24  // provides API for decoding and encoding the protobuf binary format.
    25  //
    26  // Its operation is similar to that of a bytes.Buffer: writing pushes
    27  // data to the end of the buffer while reading pops data from the head
    28  // of the buffer. So the same buffer can be used to both read and write.
    29  type Buffer codec.Buffer
    30  
    31  // NewBuffer creates a new buffer with the given slice of bytes as the
    32  // buffer's initial contents.
    33  func NewBuffer(buf []byte) *Buffer {
    34  	return (*Buffer)(codec.NewBuffer(buf))
    35  }
    36  
    37  // SetDeterministic sets this buffer to encode messages deterministically. This
    38  // is useful for tests. But the overhead is non-zero, so it should not likely be
    39  // used outside of tests. When true, map fields in a message must have their
    40  // keys sorted before serialization to ensure deterministic output. Otherwise,
    41  // values in a map field will be serialized in map iteration order.
    42  func (cb *Buffer) SetDeterministic(deterministic bool) {
    43  	(*codec.Buffer)(cb).SetDeterministic(deterministic)
    44  }
    45  
    46  // IsDeterministic returns whether or not this buffer is configured to encode
    47  // messages deterministically.
    48  func (cb *Buffer) IsDeterministic() bool {
    49  	return (*codec.Buffer)(cb).IsDeterministic()
    50  }
    51  
    52  // Reset resets this buffer back to empty. Any subsequent writes/encodes
    53  // to the buffer will allocate a new backing slice of bytes.
    54  func (cb *Buffer) Reset() {
    55  	(*codec.Buffer)(cb).Reset()
    56  }
    57  
    58  // Bytes returns the slice of bytes remaining in the buffer. Note that
    59  // this does not perform a copy: if the contents of the returned slice
    60  // are modified, the modifications will be visible to subsequent reads
    61  // via the buffer.
    62  func (cb *Buffer) Bytes() []byte {
    63  	return (*codec.Buffer)(cb).Bytes()
    64  }
    65  
    66  // String returns the remaining bytes in the buffer as a string.
    67  func (cb *Buffer) String() string {
    68  	return (*codec.Buffer)(cb).String()
    69  }
    70  
    71  // EOF returns true if there are no more bytes remaining to read.
    72  func (cb *Buffer) EOF() bool {
    73  	return (*codec.Buffer)(cb).EOF()
    74  }
    75  
    76  // Skip attempts to skip the given number of bytes in the input. If
    77  // the input has fewer bytes than the given count, io.ErrUnexpectedEOF
    78  // is returned and the buffer is unchanged. Otherwise, the given number
    79  // of bytes are skipped and nil is returned.
    80  func (cb *Buffer) Skip(count int) error {
    81  	return (*codec.Buffer)(cb).Skip(count)
    82  
    83  }
    84  
    85  // Len returns the remaining number of bytes in the buffer.
    86  func (cb *Buffer) Len() int {
    87  	return (*codec.Buffer)(cb).Len()
    88  }
    89  
    90  // Read implements the io.Reader interface. If there are no bytes
    91  // remaining in the buffer, it will return 0, io.EOF. Otherwise,
    92  // it reads max(len(dest), cb.Len()) bytes from input and copies
    93  // them into dest. It returns the number of bytes copied and a nil
    94  // error in this case.
    95  func (cb *Buffer) Read(dest []byte) (int, error) {
    96  	return (*codec.Buffer)(cb).Read(dest)
    97  }
    98  
    99  var _ io.Reader = (*Buffer)(nil)
   100  
   101  // Write implements the io.Writer interface. It always returns
   102  // len(data), nil.
   103  func (cb *Buffer) Write(data []byte) (int, error) {
   104  	return (*codec.Buffer)(cb).Write(data)
   105  }
   106  
   107  var _ io.Writer = (*Buffer)(nil)
   108  
   109  // DecodeVarint reads a varint-encoded integer from the Buffer.
   110  // This is the format for the
   111  // int32, int64, uint32, uint64, bool, and enum
   112  // protocol buffer types.
   113  func (cb *Buffer) DecodeVarint() (uint64, error) {
   114  	return (*codec.Buffer)(cb).DecodeVarint()
   115  }
   116  
   117  // DecodeTagAndWireType decodes a field tag and wire type from input.
   118  // This reads a varint and then extracts the two fields from the varint
   119  // value read.
   120  func (cb *Buffer) DecodeTagAndWireType() (tag int32, wireType int8, err error) {
   121  	return (*codec.Buffer)(cb).DecodeTagAndWireType()
   122  }
   123  
   124  // DecodeFixed64 reads a 64-bit integer from the Buffer.
   125  // This is the format for the
   126  // fixed64, sfixed64, and double protocol buffer types.
   127  func (cb *Buffer) DecodeFixed64() (x uint64, err error) {
   128  	return (*codec.Buffer)(cb).DecodeFixed64()
   129  }
   130  
   131  // DecodeFixed32 reads a 32-bit integer from the Buffer.
   132  // This is the format for the
   133  // fixed32, sfixed32, and float protocol buffer types.
   134  func (cb *Buffer) DecodeFixed32() (x uint64, err error) {
   135  	return (*codec.Buffer)(cb).DecodeFixed32()
   136  }
   137  
   138  // DecodeRawBytes reads a count-delimited byte buffer from the Buffer.
   139  // This is the format used for the bytes protocol buffer
   140  // type and for embedded messages.
   141  func (cb *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) {
   142  	return (*codec.Buffer)(cb).DecodeRawBytes(alloc)
   143  }
   144  
   145  // ReadGroup reads the input until a "group end" tag is found
   146  // and returns the data up to that point. Subsequent reads from
   147  // the buffer will read data after the group end tag. If alloc
   148  // is true, the data is copied to a new slice before being returned.
   149  // Otherwise, the returned slice is a view into the buffer's
   150  // underlying byte slice.
   151  //
   152  // This function correctly handles nested groups: if a "group start"
   153  // tag is found, then that group's end tag will be included in the
   154  // returned data.
   155  func (cb *Buffer) ReadGroup(alloc bool) ([]byte, error) {
   156  	return (*codec.Buffer)(cb).ReadGroup(alloc)
   157  }
   158  
   159  // SkipGroup is like ReadGroup, except that it discards the
   160  // data and just advances the buffer to point to the input
   161  // right *after* the "group end" tag.
   162  func (cb *Buffer) SkipGroup() error {
   163  	return (*codec.Buffer)(cb).SkipGroup()
   164  }
   165  
   166  // SkipField attempts to skip the value of a field with the given wire
   167  // type. When consuming a protobuf-encoded stream, it can be called immediately
   168  // after DecodeTagAndWireType to discard the subsequent data for the field.
   169  func (cb *Buffer) SkipField(wireType int8) error {
   170  	return (*codec.Buffer)(cb).SkipField(wireType)
   171  }
   172  
   173  // EncodeVarint writes a varint-encoded integer to the Buffer.
   174  // This is the format for the
   175  // int32, int64, uint32, uint64, bool, and enum
   176  // protocol buffer types.
   177  func (cb *Buffer) EncodeVarint(x uint64) error {
   178  	return (*codec.Buffer)(cb).EncodeVarint(x)
   179  }
   180  
   181  // EncodeTagAndWireType encodes the given field tag and wire type to the
   182  // buffer. This combines the two values and then writes them as a varint.
   183  func (cb *Buffer) EncodeTagAndWireType(tag int32, wireType int8) error {
   184  	return (*codec.Buffer)(cb).EncodeTagAndWireType(tag, wireType)
   185  }
   186  
   187  // EncodeFixed64 writes a 64-bit integer to the Buffer.
   188  // This is the format for the
   189  // fixed64, sfixed64, and double protocol buffer types.
   190  func (cb *Buffer) EncodeFixed64(x uint64) error {
   191  	return (*codec.Buffer)(cb).EncodeFixed64(x)
   192  
   193  }
   194  
   195  // EncodeFixed32 writes a 32-bit integer to the Buffer.
   196  // This is the format for the
   197  // fixed32, sfixed32, and float protocol buffer types.
   198  func (cb *Buffer) EncodeFixed32(x uint64) error {
   199  	return (*codec.Buffer)(cb).EncodeFixed32(x)
   200  }
   201  
   202  // EncodeRawBytes writes a count-delimited byte buffer to the Buffer.
   203  // This is the format used for the bytes protocol buffer
   204  // type and for embedded messages.
   205  func (cb *Buffer) EncodeRawBytes(b []byte) error {
   206  	return (*codec.Buffer)(cb).EncodeRawBytes(b)
   207  }
   208  
   209  // EncodeMessage writes the given message to the buffer.
   210  func (cb *Buffer) EncodeMessage(pm proto.Message) error {
   211  	return (*codec.Buffer)(cb).EncodeMessage(pm)
   212  }
   213  
   214  // EncodeDelimitedMessage writes the given message to the buffer with a
   215  // varint-encoded length prefix (the delimiter).
   216  func (cb *Buffer) EncodeDelimitedMessage(pm proto.Message) error {
   217  	return (*codec.Buffer)(cb).EncodeDelimitedMessage(pm)
   218  }