github.com/bakjos/protoreflect@v1.9.2/codec/codec.go (about)

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