use std::fmt;
#[derive(Debug, Clone)]
pub struct EventNodeInfo {
pub name: String,
pub node_type: Option<String>,
pub level: u32,
}
#[derive(Debug, Clone)]
pub struct EventEdgeInfo {
pub label: Option<String>,
pub edge_type: Option<String>, pub sequence: Option<u32>, }
#[derive(Debug, Clone)]
#[allow(dead_code)] pub enum GraphEvent {
AddNode { id: String, info: EventNodeInfo },
UpdateNode { id: String, info: EventNodeInfo },
RemoveNode { id: String },
AddEdge { from: String, to: String },
AddRichEdge {
from: String,
to: String,
info: EventEdgeInfo,
},
RemoveEdge { from: String, to: String },
Clear,
BatchStart,
BatchEnd,
}
impl GraphEvent {
#[allow(dead_code)] pub fn affects_node(&self, node_id: &str) -> bool {
match self {
Self::AddNode { id, .. } | Self::UpdateNode { id, .. } | Self::RemoveNode { id } => {
id == node_id
}
Self::AddEdge { from, to } | Self::RemoveEdge { from, to } => {
from == node_id || to == node_id
}
Self::AddRichEdge { from, to, .. } => from == node_id || to == node_id,
Self::Clear => true,
Self::BatchStart | Self::BatchEnd => false,
}
}
}
impl fmt::Display for GraphEvent {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::AddNode { id, info } => write!(f, "AddNode({id}: {})", info.name),
Self::UpdateNode { id, info } => write!(f, "UpdateNode({id}: {})", info.name),
Self::RemoveNode { id } => write!(f, "RemoveNode({id})"),
Self::AddEdge { from, to } => write!(f, "AddEdge({from} -> {to})"),
Self::AddRichEdge { from, to, info } => {
write!(f, "AddRichEdge({from} -> {to}")?;
if let Some(label) = &info.label {
write!(f, ": {label}")?;
}
write!(f, ")")
}
Self::RemoveEdge { from, to } => write!(f, "RemoveEdge({from} -> {to})"),
Self::Clear => write!(f, "Clear"),
Self::BatchStart => write!(f, "BatchStart"),
Self::BatchEnd => write!(f, "BatchEnd"),
}
}
}
#[derive(Debug)]
pub enum EventResult {
Success,
NodeExists,
NodeNotFound,
EdgeExists,
EdgeNotFound,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_event_affects_node() {
let event = GraphEvent::AddNode {
id: "A".to_string(),
info: EventNodeInfo {
name: "Node A".to_string(),
node_type: None,
level: 0,
},
};
assert!(event.affects_node("A"));
assert!(!event.affects_node("B"));
}
#[test]
fn test_edge_events_affect_both_nodes() {
let event = GraphEvent::AddEdge {
from: "A".to_string(),
to: "B".to_string(),
};
assert!(event.affects_node("A"));
assert!(event.affects_node("B"));
assert!(!event.affects_node("C"));
}
}