pub type SnapshotId = u64;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PubSubEventType {
Node,
Edge,
KV,
Commit,
All,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PubSubEvent {
NodeChanged {
node_id: i64,
snapshot_id: SnapshotId,
},
EdgeChanged {
edge_id: i64,
snapshot_id: SnapshotId,
},
KVChanged {
key_hash: u64,
snapshot_id: SnapshotId,
},
SnapshotCommitted {
snapshot_id: SnapshotId,
},
}
impl PubSubEvent {
pub fn event_type(&self) -> PubSubEventType {
match self {
PubSubEvent::NodeChanged { .. } => PubSubEventType::Node,
PubSubEvent::EdgeChanged { .. } => PubSubEventType::Edge,
PubSubEvent::KVChanged { .. } => PubSubEventType::KV,
PubSubEvent::SnapshotCommitted { .. } => PubSubEventType::Commit,
}
}
pub fn snapshot_id(&self) -> SnapshotId {
match self {
PubSubEvent::NodeChanged { snapshot_id, .. } => *snapshot_id,
PubSubEvent::EdgeChanged { snapshot_id, .. } => *snapshot_id,
PubSubEvent::KVChanged { snapshot_id, .. } => *snapshot_id,
PubSubEvent::SnapshotCommitted { snapshot_id } => *snapshot_id,
}
}
pub fn is_node_event(&self) -> bool {
matches!(self, PubSubEvent::NodeChanged { .. })
}
pub fn is_edge_event(&self) -> bool {
matches!(self, PubSubEvent::EdgeChanged { .. })
}
pub fn is_kv_event(&self) -> bool {
matches!(self, PubSubEvent::KVChanged { .. })
}
pub fn is_commit_event(&self) -> bool {
matches!(self, PubSubEvent::SnapshotCommitted { .. })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_event_type_classification() {
let node_event = PubSubEvent::NodeChanged {
node_id: 42,
snapshot_id: 100,
};
assert_eq!(node_event.event_type(), PubSubEventType::Node);
assert!(node_event.is_node_event());
assert!(!node_event.is_edge_event());
assert!(!node_event.is_kv_event());
assert!(!node_event.is_commit_event());
let edge_event = PubSubEvent::EdgeChanged {
edge_id: 123,
snapshot_id: 100,
};
assert_eq!(edge_event.event_type(), PubSubEventType::Edge);
assert!(!edge_event.is_node_event());
assert!(edge_event.is_edge_event());
assert!(!edge_event.is_kv_event());
assert!(!edge_event.is_commit_event());
let kv_event = PubSubEvent::KVChanged {
key_hash: 999,
snapshot_id: 100,
};
assert_eq!(kv_event.event_type(), PubSubEventType::KV);
assert!(!kv_event.is_node_event());
assert!(!kv_event.is_edge_event());
assert!(kv_event.is_kv_event());
assert!(!kv_event.is_commit_event());
let commit_event = PubSubEvent::SnapshotCommitted { snapshot_id: 100 };
assert_eq!(commit_event.event_type(), PubSubEventType::Commit);
assert!(!commit_event.is_node_event());
assert!(!commit_event.is_edge_event());
assert!(!commit_event.is_kv_event());
assert!(commit_event.is_commit_event());
}
#[test]
fn test_snapshot_id_extraction() {
let snapshot_id = 42u64;
assert_eq!(
PubSubEvent::NodeChanged {
node_id: 1,
snapshot_id
}
.snapshot_id(),
snapshot_id
);
assert_eq!(
PubSubEvent::EdgeChanged {
edge_id: 2,
snapshot_id
}
.snapshot_id(),
snapshot_id
);
assert_eq!(
PubSubEvent::KVChanged {
key_hash: 3,
snapshot_id
}
.snapshot_id(),
snapshot_id
);
assert_eq!(
PubSubEvent::SnapshotCommitted { snapshot_id }.snapshot_id(),
snapshot_id
);
}
#[test]
fn test_id_only_design() {
let event = PubSubEvent::NodeChanged {
node_id: 123,
snapshot_id: 456,
};
assert_eq!(event.snapshot_id(), 456);
assert!(event.is_node_event());
}
#[test]
fn test_event_equality() {
let event1 = PubSubEvent::NodeChanged {
node_id: 42,
snapshot_id: 100,
};
let event2 = PubSubEvent::NodeChanged {
node_id: 42,
snapshot_id: 100,
};
let event3 = PubSubEvent::NodeChanged {
node_id: 43,
snapshot_id: 100,
};
assert_eq!(event1, event2);
assert_ne!(event1, event3);
}
}