use uuid::Uuid;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum AwaitedChat {
#[default]
Nothing,
Chat(Uuid),
Created,
}
impl AwaitedChat {
pub fn take_if_arrived(&mut self, id: Uuid) -> bool {
let arrived = match *self {
Self::Nothing => false,
Self::Chat(awaited) => awaited == id,
Self::Created => true,
};
if arrived {
*self = Self::Nothing;
}
arrived
}
pub fn clear(&mut self) {
*self = Self::Nothing;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn an_existing_chat_is_awaited_by_id_and_taken_once() {
let (asked, other) = (Uuid::new_v4(), Uuid::new_v4());
let mut awaited = AwaitedChat::Chat(asked);
assert!(
!awaited.take_if_arrived(other),
"somebody else's activation"
);
assert_eq!(awaited, AwaitedChat::Chat(asked), "still waiting");
assert!(awaited.take_if_arrived(asked));
assert!(!awaited.take_if_arrived(asked), "consumed");
}
#[test]
fn a_created_chat_is_whatever_activates_next() {
let mut awaited = AwaitedChat::Created;
assert!(awaited.take_if_arrived(Uuid::new_v4()));
assert!(!awaited.take_if_arrived(Uuid::new_v4()), "consumed");
}
#[test]
fn nothing_awaited_and_a_cleared_wait_take_nothing() {
let id = Uuid::new_v4();
assert!(!AwaitedChat::default().take_if_arrived(id));
let mut awaited = AwaitedChat::Chat(id);
awaited.clear();
assert!(!awaited.take_if_arrived(id));
}
}