52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package blkstorage
|
|
|
|
import (
|
|
"github.com/golang/protobuf/proto"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// buffer provides a wrapper on top of proto.Buffer.
|
|
// The purpose of this wrapper is to get to know the current position in the []byte
|
|
type buffer struct {
|
|
buf *proto.Buffer
|
|
position int
|
|
}
|
|
|
|
// newBuffer constructs a new instance of Buffer
|
|
func newBuffer(b []byte) *buffer {
|
|
return &buffer{proto.NewBuffer(b), 0}
|
|
}
|
|
|
|
// DecodeVarint wraps the actual method and updates the position
|
|
func (b *buffer) DecodeVarint() (uint64, error) {
|
|
val, err := b.buf.DecodeVarint()
|
|
if err == nil {
|
|
b.position += proto.SizeVarint(val)
|
|
} else {
|
|
err = errors.Wrap(err, "error decoding varint with proto.Buffer")
|
|
}
|
|
return val, err
|
|
}
|
|
|
|
// DecodeRawBytes wraps the actual method and updates the position
|
|
func (b *buffer) DecodeRawBytes(alloc bool) ([]byte, error) {
|
|
val, err := b.buf.DecodeRawBytes(alloc)
|
|
if err == nil {
|
|
b.position += proto.SizeVarint(uint64(len(val))) + len(val)
|
|
} else {
|
|
err = errors.Wrap(err, "error decoding raw bytes with proto.Buffer")
|
|
}
|
|
return val, err
|
|
}
|
|
|
|
// GetBytesConsumed returns the offset of the current position in the underlying []byte
|
|
func (b *buffer) GetBytesConsumed() int {
|
|
return b.position
|
|
}
|