use crate::core::types::MsgId;
use crate::util::dict::DictMap;
use super::message::Msg;
#[derive(Debug)]
pub struct MsgIndex {
inner: DictMap<MsgId, Msg>,
}
impl Default for MsgIndex {
fn default() -> Self {
Self {
inner: DictMap::new(),
}
}
}
impl MsgIndex {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, msg: Msg) -> Option<Msg> {
self.inner.insert(msg.id(), msg)
}
pub fn remove(&mut self, id: MsgId) -> Option<Msg> {
self.inner.remove(&id)
}
#[must_use]
pub fn get(&self, id: MsgId) -> Option<&Msg> {
self.inner.get(&id)
}
pub fn get_mut(&mut self, id: MsgId) -> Option<&mut Msg> {
self.inner.get_mut(&id)
}
#[must_use]
pub fn contains_key(&self, id: MsgId) -> bool {
self.inner.contains_key(&id)
}
#[must_use]
pub fn len(&self) -> usize {
self.inner.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::msg::{Msg, MsgType};
#[test]
fn round_trip() {
let mut idx = MsgIndex::new();
let m = Msg::new(42, MsgType::ReqRedisGet, true);
assert!(idx.insert(m).is_none());
assert!(idx.contains_key(42));
let popped = idx.remove(42).expect("present");
assert_eq!(popped.id(), 42);
assert!(!idx.contains_key(42));
}
#[test]
fn get_and_get_mut_borrow_the_entry() {
let mut idx = MsgIndex::new();
idx.insert(Msg::new(7, MsgType::ReqRedisGet, true));
assert_eq!(idx.get(7).unwrap().id(), 7);
assert!(idx.get(8).is_none());
idx.get_mut(7).unwrap().set_done(true);
assert!(idx.get(7).unwrap().flags().done);
assert!(idx.get_mut(8).is_none());
}
#[test]
fn len_and_is_empty_track_population() {
let mut idx = MsgIndex::new();
assert!(idx.is_empty());
assert_eq!(idx.len(), 0);
idx.insert(Msg::new(1, MsgType::ReqRedisGet, true));
assert!(!idx.is_empty());
assert_eq!(idx.len(), 1);
}
}