use tungstenite::Message;
#[derive(Debug)]
struct StoredMessage {
index: usize,
message: Message,
count: usize,
}
#[derive(Debug)]
pub struct MatchState {
messages_received: usize,
stored_messages: Vec<StoredMessage>,
}
impl MatchState {
#[doc(hidden)]
pub fn new() -> Self {
MatchState {
messages_received: 0,
stored_messages: vec![],
}
}
pub(crate) fn push_message(&mut self, message: Message) {
self.stored_messages.push(StoredMessage {
index: self.messages_received,
message,
count: 0,
});
self.messages_received += 1;
}
pub fn keep_message(&mut self, index: usize) {
if let Some(stored) = self
.stored_messages
.iter_mut()
.rev()
.find(|x| x.index == index)
{
stored.count += 1;
} else {
panic!("Message index not found");
}
}
pub(crate) fn evict(&mut self) {
self.stored_messages.retain(|x| x.count > 0)
}
pub fn forget_message(&mut self, index: usize) {
if let Some(stored) = self
.stored_messages
.iter_mut()
.rev()
.find(|x| x.index == index)
{
stored.count = stored.count.saturating_sub(1);
}
}
pub fn last(&self) -> &Message {
&self.stored_messages.last().unwrap().message
}
pub fn get_message(&self, index: usize) -> Option<&Message> {
self.stored_messages
.iter()
.find(|x| x.index == index)
.map(|x| &x.message)
}
pub fn len(&self) -> usize {
self.messages_received
}
}
#[doc(hidden)]
pub fn default_doctest_state() -> MatchState {
let mut state = MatchState::new();
state.push_message(Message::Close(None));
state
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn state_eviction() {
let mut state = MatchState::new();
state.push_message(Message::text("hello"));
assert_eq!(state.stored_messages.len(), 1);
assert_eq!(state.messages_received, 1);
state.evict();
assert_eq!(state.stored_messages.len(), 0);
assert_eq!(state.messages_received, 1);
state.push_message(Message::text("hello"));
state.keep_message(1);
state.evict();
assert_eq!(state.stored_messages.len(), 1);
assert_eq!(state.messages_received, 2);
state.forget_message(0);
state.evict();
assert_eq!(state.stored_messages.len(), 1);
state.forget_message(1);
assert_eq!(state.stored_messages.len(), 1);
state.evict();
assert_eq!(state.stored_messages.len(), 0);
}
}