use crate::backend::native::{NativeBackendError, NativeResult};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Direction {
Outgoing,
Incoming,
}
#[derive(Debug, Clone)]
pub struct CompactEdgeRecord {
pub neighbor_id: i64,
pub edge_type_offset: u16,
pub edge_data: Vec<u8>,
}
impl CompactEdgeRecord {
pub fn new(neighbor_id: i64, edge_type_offset: u16, edge_data: Vec<u8>) -> Self {
Self {
neighbor_id,
edge_type_offset,
edge_data,
}
}
pub fn serialize(&self) -> Vec<u8> {
let edge_data_len = self.edge_data.len() as u16;
let mut buffer = Vec::with_capacity(8 + 2 + 2 + self.edge_data.len());
buffer.extend_from_slice(&self.neighbor_id.to_be_bytes());
buffer.extend_from_slice(&self.edge_type_offset.to_be_bytes());
buffer.extend_from_slice(&edge_data_len.to_be_bytes());
buffer.extend_from_slice(&self.edge_data);
buffer
}
pub fn deserialize(bytes: &[u8]) -> NativeResult<Self> {
if bytes.len() < 12 {
return Err(NativeBackendError::BufferTooSmall {
size: bytes.len(),
min_size: 12,
});
}
let neighbor_id = i64::from_be_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
]);
let edge_type_offset = u16::from_be_bytes([bytes[8], bytes[9]]);
let edge_data_len = u16::from_be_bytes([bytes[10], bytes[11]]) as usize;
if bytes.len() < 12 + edge_data_len {
return Err(NativeBackendError::BufferTooSmall {
size: bytes.len(),
min_size: 12 + edge_data_len,
});
}
let edge_data = bytes[12..12 + edge_data_len].to_vec();
Ok(Self {
neighbor_id,
edge_type_offset,
edge_data,
})
}
pub fn size_bytes(&self) -> usize {
8 + 2 + 2 + self.edge_data.len()
}
}