package db0403 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) EncodeVal(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) DecodeVal(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") } } func encodeStrKey(toAppend []byte, input []byte) []byte func decodeStrKey(data []byte) (out []byte, rest []byte, err error) func (cell *Cell) EncodeKey(toAppend []byte) []byte func (cell *Cell) DecodeKey(data []byte) (rest []byte, err error) // QzBQWVJJOUhU https://trialofcode.org/