package db0305 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/