use crate::event::MobEvent;
use crate::ids::{AgentIdentity, Generation, MeerkatId, ProfileName};
use crate::roster::{MobMemberKickoffSnapshot, Roster, RosterAddEntry, RosterEntry};
mod sealed {
pub trait Sealed {}
}
pub(crate) trait RosterMutator: sealed::Sealed {
fn add_member(&mut self, entry: RosterAddEntry) -> bool;
fn remove_member(&mut self, agent_identity: &MeerkatId) -> bool;
fn set_kickoff(
&mut self,
agent_identity: &MeerkatId,
kickoff: Option<MobMemberKickoffSnapshot>,
) -> bool;
}
#[derive(Debug, Clone)]
pub(crate) struct RosterAuthority {
roster: Roster,
}
impl sealed::Sealed for RosterAuthority {}
impl RosterAuthority {
pub(crate) fn new() -> Self {
Self {
roster: Roster::new(),
}
}
pub(crate) fn from_roster(roster: Roster) -> Self {
Self { roster }
}
pub(crate) fn snapshot(&self) -> Roster {
self.roster.clone()
}
pub(crate) fn get(&self, agent_identity: &MeerkatId) -> Option<&RosterEntry> {
self.roster.get(agent_identity)
}
pub(crate) fn get_by_identity(&self, identity: &AgentIdentity) -> Option<&RosterEntry> {
self.roster.get_by_identity(identity)
}
pub(crate) fn list(&self) -> impl Iterator<Item = &RosterEntry> {
self.roster.list()
}
pub(crate) fn list_all(&self) -> impl Iterator<Item = &RosterEntry> {
self.roster.list_all()
}
pub(crate) fn by_profile(&self, profile: &ProfileName) -> impl Iterator<Item = &RosterEntry> {
self.roster.by_profile(profile)
}
pub(crate) fn entry(&self, agent_identity: &MeerkatId) -> Option<RosterEntry> {
self.roster.get(agent_identity).cloned()
}
pub(crate) fn apply_event(&mut self, event: &MobEvent) {
self.roster.apply(event);
}
pub(crate) fn mark_retiring_by_identity(&mut self, identity: &AgentIdentity) -> bool {
self.roster.mark_retiring_by_identity(identity)
}
pub(crate) fn replace_backend_peer_binding_by_peer_id(
&mut self,
prior_peer_id: &str,
next_peer_id: &str,
next_address: &str,
bootstrap_token: Option<meerkat_contracts::wire::supervisor_bridge::BridgeBootstrapToken>,
) -> Vec<(AgentIdentity, Generation, Option<[u8; 32]>)> {
self.roster.replace_backend_peer_binding_by_peer_id(
prior_peer_id,
next_peer_id,
next_address,
bootstrap_token,
)
}
}
impl RosterMutator for RosterAuthority {
fn add_member(&mut self, entry: RosterAddEntry) -> bool {
self.roster.add(entry)
}
fn remove_member(&mut self, agent_identity: &MeerkatId) -> bool {
if self.roster.get(agent_identity).is_some() {
self.roster.remove(agent_identity);
true
} else {
false
}
}
fn set_kickoff(
&mut self,
agent_identity: &MeerkatId,
kickoff: Option<MobMemberKickoffSnapshot>,
) -> bool {
self.roster.set_kickoff(agent_identity, kickoff)
}
}