Files
herolib/lib/data/radixtree/serialize.v
2025-01-31 08:29:17 +03:00

78 lines
1.5 KiB
V

module radixtree
import freeflowuniverse.herolib.data.encoder
const (
version = u8(1) // Current binary format version
)
// Serializes a node to bytes for storage
fn serialize_node(node Node) []u8 {
mut e := encoder.new()
// Add version byte
e.add_u8(version)
// Add key segment
e.add_string(node.key_segment)
// Add value as []u8
e.add_u16(u16(node.value.len))
e.data << node.value
// Add children
e.add_u16(u16(node.children.len))
for child in node.children {
e.add_string(child.key_part)
e.add_u32(child.node_id)
}
// Add leaf flag
e.add_u8(if node.is_leaf { u8(1) } else { u8(0) })
return e.data
}
// Deserializes bytes to a node
fn deserialize_node(data []u8) !Node {
mut d := encoder.decoder_new(data)
// Read and verify version
version_byte := d.get_u8()
if version_byte != version {
return error('Invalid version byte: expected ${version}, got ${version_byte}')
}
// Read key segment
key_segment := d.get_string()
// Read value as []u8
value_len := d.get_u16()
mut value := []u8{len: int(value_len)}
for i in 0..int(value_len) {
value[i] = d.get_u8()
}
// Read children
children_len := d.get_u16()
mut children := []NodeRef{cap: int(children_len)}
for _ in 0 .. children_len {
key_part := d.get_string()
node_id := d.get_u32()
children << NodeRef{
key_part: key_part
node_id: node_id
}
}
// Read leaf flag
is_leaf := d.get_u8() == 1
return Node{
key_segment: key_segment
value: value
children: children
is_leaf: is_leaf
}
}