use std::collections::{HashMap, VecDeque};
use crate::core::group_update_handle::{CurrentEpochProposals, ProposalId};
use crate::protos::de_mls::messages::v1::GroupUpdateRequest;
#[derive(Clone, Debug)]
pub struct GroupHandle {
group_name: String,
app_id: Vec<u8>,
steward: bool,
mls_initialized: bool,
proposals: CurrentEpochProposals,
}
impl GroupHandle {
pub fn new_for_join(group_name: &str) -> Self {
Self {
group_name: group_name.to_string(),
app_id: uuid::Uuid::new_v4().as_bytes().to_vec(),
steward: false,
mls_initialized: false,
proposals: CurrentEpochProposals::new(),
}
}
pub fn new_as_creator(group_name: &str) -> Self {
Self {
group_name: group_name.to_string(),
app_id: uuid::Uuid::new_v4().as_bytes().to_vec(),
steward: true,
mls_initialized: true,
proposals: CurrentEpochProposals::new(),
}
}
pub fn group_name(&self) -> &str {
&self.group_name
}
pub fn group_name_bytes(&self) -> &[u8] {
self.group_name.as_bytes()
}
pub fn app_id(&self) -> &[u8] {
&self.app_id
}
pub fn is_steward(&self) -> bool {
self.steward
}
pub fn is_mls_initialized(&self) -> bool {
self.mls_initialized
}
pub fn set_mls_initialized(&mut self) {
self.mls_initialized = true;
}
pub fn become_steward(&mut self) {
self.steward = true;
}
pub fn resign_steward(&mut self) {
self.steward = false;
}
pub fn is_owner_of_proposal(&self, proposal_id: ProposalId) -> bool {
self.proposals.is_owner_of_proposal(proposal_id)
}
pub fn approved_proposals_count(&self) -> usize {
self.proposals.approved_proposals_count()
}
pub fn approved_proposals(&self) -> HashMap<ProposalId, GroupUpdateRequest> {
self.proposals.approved_proposals()
}
pub fn mark_proposal_as_approved(&mut self, proposal_id: ProposalId) {
self.proposals.move_proposal_to_approved(proposal_id);
}
pub fn mark_proposal_as_rejected(&mut self, proposal_id: ProposalId) {
self.proposals.remove_voting_proposal(proposal_id);
}
pub fn store_voting_proposal(&mut self, proposal_id: ProposalId, proposal: GroupUpdateRequest) {
self.proposals.add_voting_proposal(proposal_id, proposal);
}
pub fn insert_approved_proposal(
&mut self,
proposal_id: ProposalId,
proposal: GroupUpdateRequest,
) {
self.proposals.add_proposal(proposal_id, proposal);
}
pub fn clear_approved_proposals(&mut self) {
self.proposals.clear_approved_proposals();
}
pub fn epoch_history(&self) -> &VecDeque<HashMap<ProposalId, GroupUpdateRequest>> {
self.proposals.epoch_history()
}
}