use std::sync::Arc;
use crate::objects::itembroker::collection_item_observer::CollectionItemObserver;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum CollectionItemBrokerEventType {
NotSet = 0,
NewObserver = 1,
CollectionUpdated = 2,
}
#[derive(Debug, Clone)]
pub struct CollectionItemBrokerEvent {
pub event_type: CollectionItemBrokerEventType,
pub key: Option<Vec<u8>>,
pub keys: Option<Vec<Vec<u8>>>,
pub observer: Option<Arc<CollectionItemObserver>>,
}
impl CollectionItemBrokerEvent {
#[inline]
pub fn create_collection_updated_event(key: Vec<u8>) -> Self {
Self {
event_type: CollectionItemBrokerEventType::CollectionUpdated,
key: Some(key),
keys: None,
observer: None,
}
}
#[inline]
pub fn create_new_observer_event(
observer: Arc<CollectionItemObserver>,
keys: Vec<Vec<u8>>,
) -> Self {
Self {
event_type: CollectionItemBrokerEventType::NewObserver,
key: None,
keys: Some(keys),
observer: Some(observer),
}
}
#[inline]
pub fn is_default(&self) -> bool {
self.event_type == CollectionItemBrokerEventType::NotSet
}
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use super::*;
use crate::{
objects::itembroker::collection_item_observer::CollectionItemObserver, types::RespCommand,
};
#[test]
fn event_constructors() {
let updated = CollectionItemBrokerEvent::create_collection_updated_event(b"k".to_vec());
assert_eq!(
updated.event_type,
CollectionItemBrokerEventType::CollectionUpdated
);
assert_eq!(updated.key.as_deref(), Some(b"k".as_slice()));
assert!(!updated.is_default());
let observer = Arc::new(CollectionItemObserver::new(1, RespCommand::Blpop, vec![]));
let new_observer =
CollectionItemBrokerEvent::create_new_observer_event(observer, vec![b"k1".to_vec()]);
assert_eq!(
new_observer.event_type,
CollectionItemBrokerEventType::NewObserver
);
assert_eq!(new_observer.keys, Some(vec![b"k1".to_vec()]));
assert!(new_observer.observer.is_some());
let default_ev = CollectionItemBrokerEvent {
event_type: CollectionItemBrokerEventType::NotSet,
key: None,
keys: None,
observer: None,
};
assert!(default_ev.is_default());
}
}