use std::collections::HashMap;
use nerve_protocol::types::RequestId;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RequestState {
Active,
Cancelled,
}
#[derive(Default)]
pub struct RequestTable {
requests: HashMap<RequestId, RequestState>,
}
impl RequestTable {
#[inline]
pub fn new() -> Self {
Self {
requests: HashMap::new(),
}
}
pub fn insert(&mut self, request_id: RequestId) -> bool {
match self.requests.get(&request_id) {
Some(_) => false,
None => {
self.requests.insert(request_id, RequestState::Active);
true
}
}
}
pub fn cancel(&mut self, request_id: RequestId) -> bool {
match self.requests.get_mut(&request_id) {
Some(state) => {
*state = RequestState::Cancelled;
true
}
None => false,
}
}
pub fn is_cancelled(&self, request_id: RequestId) -> bool {
matches!(
self.requests.get(&request_id),
Some(RequestState::Cancelled)
)
}
pub fn remove(&mut self, request_id: RequestId) {
self.requests.remove(&request_id);
}
pub fn len(&self) -> usize {
self.requests.len()
}
pub fn is_empty(&self) -> bool {
self.requests.is_empty()
}
pub fn contains(&self, request_id: RequestId) -> bool {
self.requests.contains_key(&request_id)
}
pub fn is_active(&self, request_id: RequestId) -> bool {
matches!(self.requests.get(&request_id), Some(RequestState::Active))
}
}