use std::collections::VecDeque;
use super::types::ClusterEvent;
#[derive(Debug)]
pub struct ClusterEventLog {
events: VecDeque<ClusterEvent>,
max_events: usize,
}
impl Default for ClusterEventLog {
fn default() -> Self {
Self::new()
}
}
impl ClusterEventLog {
pub fn new() -> Self {
Self {
events: VecDeque::with_capacity(10000usize),
max_events: 10000,
}
}
pub fn with_capacity(max_events: usize) -> Self {
Self {
events: VecDeque::with_capacity(max_events),
max_events,
}
}
pub fn log_event(&mut self, event: ClusterEvent) {
self.events.push_back(event);
while self.events.len() > self.max_events {
self.events.pop_front();
}
}
pub fn get_recent_events(&self, count: usize) -> Vec<ClusterEvent> {
self.events.iter().rev().take(count).cloned().collect()
}
pub fn get_all_events(&self) -> Vec<ClusterEvent> {
self.events.iter().cloned().collect()
}
pub fn get_events_chronological(&self) -> Vec<ClusterEvent> {
self.events.iter().cloned().collect()
}
pub fn event_count(&self) -> usize {
self.events.len()
}
pub fn clear(&mut self) {
self.events.clear();
}
pub fn set_max_events(&mut self, max_events: usize) {
self.max_events = max_events;
while self.events.len() > self.max_events {
self.events.pop_front();
}
}
pub fn get_max_events(&self) -> usize {
self.max_events
}
pub fn is_empty(&self) -> bool {
self.events.is_empty()
}
pub fn is_full(&self) -> bool {
self.events.len() >= self.max_events
}
pub fn get_filtered_events<F>(&self, filter: F) -> Vec<ClusterEvent>
where
F: Fn(&ClusterEvent) -> bool,
{
self.events
.iter()
.filter(|event| filter(event))
.cloned()
.collect()
}
pub fn get_oldest_event(&self) -> Option<&ClusterEvent> {
self.events.front()
}
pub fn get_newest_event(&self) -> Option<&ClusterEvent> {
self.events.back()
}
}