Files
herolib/lib/data/graphdb/serialization.v
2025-10-12 12:30:19 +03:00

166 lines
3.2 KiB
V

module graphdb
import incubaid.herolib.data.encoder
const version_v1 = u8(1)
// Serializes a Node struct to bytes
pub fn serialize_node(node Node) []u8 {
mut e := encoder.new()
// Add version byte
e.add_u8(version_v1)
// Serialize node ID
e.add_u32(node.id)
// Serialize node type
e.add_string(node.node_type)
// Serialize properties
e.add_u16(u16(node.properties.len)) // Number of properties
for key, value in node.properties {
e.add_string(key)
e.add_string(value)
}
// Serialize outgoing edges
e.add_u16(u16(node.edges_out.len)) // Number of outgoing edges
for edge in node.edges_out {
e.add_u32(edge.edge_id)
e.add_string(edge.edge_type)
}
// Serialize incoming edges
e.add_u16(u16(node.edges_in.len)) // Number of incoming edges
for edge in node.edges_in {
e.add_u32(edge.edge_id)
e.add_string(edge.edge_type)
}
return e.data
}
// Deserializes bytes to a Node struct
pub fn deserialize_node(data []u8) !Node {
if data.len < 1 {
return error('Invalid node data: too short')
}
mut d := encoder.decoder_new(data)
// Check version
version := d.get_u8()!
if version != version_v1 {
return error('Unsupported version: ${version}')
}
mut node := Node{
properties: map[string]string{}
edges_out: []EdgeRef{}
edges_in: []EdgeRef{}
}
// Deserialize node ID
node.id = d.get_u32()!
// Deserialize node type
node.node_type = d.get_string()!
// Deserialize properties
num_properties := d.get_u16()!
for _ in 0 .. num_properties {
key := d.get_string()!
value := d.get_string()!
node.properties[key] = value
}
// Deserialize outgoing edges
num_edges_out := d.get_u16()!
for _ in 0 .. num_edges_out {
edge_id := d.get_u32()!
edge_type := d.get_string()!
node.edges_out << EdgeRef{
edge_id: edge_id
edge_type: edge_type
}
}
// Deserialize incoming edges
num_edges_in := d.get_u16()!
for _ in 0 .. num_edges_in {
edge_id := d.get_u32()!
edge_type := d.get_string()!
node.edges_in << EdgeRef{
edge_id: edge_id
edge_type: edge_type
}
}
return node
}
// Serializes an Edge struct to bytes
pub fn serialize_edge(edge Edge) []u8 {
mut e := encoder.new()
// Add version byte
e.add_u8(version_v1)
// Serialize edge ID
e.add_u32(edge.id)
// Serialize edge metadata
e.add_u32(edge.from_node)
e.add_u32(edge.to_node)
e.add_string(edge.edge_type)
e.add_u16(edge.weight)
// Serialize properties
e.add_u16(u16(edge.properties.len))
for key, value in edge.properties {
e.add_string(key)
e.add_string(value)
}
return e.data
}
// Deserializes bytes to an Edge struct
pub fn deserialize_edge(data []u8) !Edge {
if data.len < 1 {
return error('Invalid edge data: too short')
}
mut d := encoder.decoder_new(data)
// Check version
version := d.get_u8()!
if version != version_v1 {
return error('Unsupported version: ${version}')
}
mut edge := Edge{
properties: map[string]string{}
}
// Deserialize edge ID
edge.id = d.get_u32()!
// Deserialize edge metadata
edge.from_node = d.get_u32()!
edge.to_node = d.get_u32()!
edge.edge_type = d.get_string()!
edge.weight = d.get_u16()!
// Deserialize properties
num_properties := d.get_u16()!
for _ in 0 .. num_properties {
key := d.get_string()!
value := d.get_string()!
edge.properties[key] = value
}
return edge
}