37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
package bread
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
var (
|
|
ErrUnderflow = errors.New("buffer underflow: not enough data to read") // Error if buffer underflow
|
|
ErrNumber = errors.New("failed to read number from buffer") // Error with read number
|
|
ErrBool = errors.New("unsupported boolean byte in buffer") // Error with read boolean
|
|
ErrString = errors.New("length of the string from the buffer is less than expected") // Error with read string
|
|
)
|
|
|
|
// Helper for check bytes in buffer not underflow
|
|
func checkLength(buf *bytes.Buffer, size int) error {
|
|
if buf.Len() < size {
|
|
return fmt.Errorf("%w: got %d of expected %d bytes", ErrUnderflow, buf.Len(), size)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Helper for read number in LittleEndian
|
|
func readNumber(buf *bytes.Buffer, data any, size int) error {
|
|
if buf.Len() < size {
|
|
return fmt.Errorf("%w: got %d of expected %d bytes", ErrUnderflow, buf.Len(), size)
|
|
}
|
|
|
|
if err := binary.Read(buf, binary.LittleEndian, data); err != nil {
|
|
return fmt.Errorf("%w: %w", ErrNumber, err)
|
|
}
|
|
|
|
return nil
|
|
}
|