166 lines
3.2 KiB
V
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
|
|
}
|