Files
2026-08-04 21:39:01 +02:00

58 lines
1.1 KiB
Go

package db0402
import (
"encoding/binary"
"errors"
"slices"
)
type CellType uint8
const (
TypeI64 CellType = 1
TypeStr CellType = 2
)
type Cell struct {
Type CellType
I64 int64
Str []byte
}
func (cell *Cell) Encode(toAppend []byte) []byte {
switch cell.Type {
case TypeI64:
return binary.LittleEndian.AppendUint64(toAppend, uint64(cell.I64))
case TypeStr:
toAppend = binary.LittleEndian.AppendUint32(toAppend, uint32(len(cell.Str)))
return append(toAppend, cell.Str...)
default:
panic("unreachable")
}
}
func (cell *Cell) Decode(data []byte) (rest []byte, err error) {
switch cell.Type {
case TypeI64:
if len(data) < 8 {
return data, errors.New("expect more data")
}
cell.I64 = int64(binary.LittleEndian.Uint64(data[0:8]))
return data[8:], nil
case TypeStr:
if len(data) < 4 {
return data, errors.New("expect more data")
}
size := int(binary.LittleEndian.Uint32(data[0:4]))
if len(data) < 4+size {
return data, errors.New("expect more data")
}
cell.Str = slices.Clone(data[4 : 4+size])
return data[4+size:], nil
default:
panic("unreachable")
}
}
// QzBQWVJJOUhU https://trialofcode.org/