use std::collections::{HashMap, VecDeque};
use crate::protos::de_mls::messages::v1::GroupUpdateRequest;
pub type ProposalId = u32;
const MAX_EPOCH_HISTORY: usize = 10;
#[derive(Clone, Debug, Default)]
pub struct CurrentEpochProposals {
approved_proposals: HashMap<ProposalId, GroupUpdateRequest>,
voting_proposals: HashMap<ProposalId, GroupUpdateRequest>,
epoch_history: VecDeque<HashMap<ProposalId, GroupUpdateRequest>>,
}
impl CurrentEpochProposals {
pub fn new() -> Self {
Self {
approved_proposals: HashMap::new(),
voting_proposals: HashMap::new(),
epoch_history: VecDeque::new(),
}
}
pub fn add_proposal(&mut self, proposal_id: ProposalId, proposal: GroupUpdateRequest) {
self.approved_proposals.insert(proposal_id, proposal);
}
pub fn approved_proposals_count(&self) -> usize {
self.approved_proposals.len()
}
pub fn approved_proposals(&self) -> HashMap<ProposalId, GroupUpdateRequest> {
self.approved_proposals.clone()
}
pub fn add_voting_proposal(&mut self, proposal_id: ProposalId, proposal: GroupUpdateRequest) {
self.voting_proposals.insert(proposal_id, proposal);
}
pub fn remove_voting_proposal(&mut self, proposal_id: ProposalId) {
self.voting_proposals.remove(&proposal_id);
}
pub fn clear_approved_proposals(&mut self) {
if !self.approved_proposals.is_empty() {
let snapshot = std::mem::take(&mut self.approved_proposals);
if self.epoch_history.len() >= MAX_EPOCH_HISTORY {
self.epoch_history.pop_front();
}
self.epoch_history.push_back(snapshot);
}
}
pub fn epoch_history(&self) -> &VecDeque<HashMap<ProposalId, GroupUpdateRequest>> {
&self.epoch_history
}
pub fn move_proposal_to_approved(&mut self, proposal_id: ProposalId) {
if let Some(proposal) = self.voting_proposals.remove(&proposal_id) {
self.approved_proposals.insert(proposal_id, proposal);
}
}
pub fn is_owner_of_proposal(&self, proposal_id: ProposalId) -> bool {
self.voting_proposals.contains_key(&proposal_id)
}
}