use super::{MessageBroker, PartyId};
use std::sync::Arc;
#[derive(Clone)]
pub struct Parameters {
parties: Vec<PartyId>,
self_index: usize,
threshold: usize,
broker: Arc<dyn MessageBroker + Send + Sync>,
}
impl Parameters {
pub fn new(
parties: Vec<PartyId>,
self_id: &PartyId,
threshold: usize,
broker: Arc<dyn MessageBroker + Send + Sync>,
) -> Self {
let self_index = parties
.iter()
.position(|p| p.cmp_key(self_id) == std::cmp::Ordering::Equal)
.expect("self_id must be one of the parties");
Parameters {
parties,
self_index,
threshold,
broker,
}
}
pub fn party_id(&self) -> &PartyId {
&self.parties[self.self_index]
}
pub fn party_index(&self) -> usize {
self.self_index
}
pub fn parties(&self) -> &[PartyId] {
&self.parties
}
pub fn party_count(&self) -> usize {
self.parties.len()
}
pub fn threshold(&self) -> usize {
self.threshold
}
pub fn broker(&self) -> &Arc<dyn MessageBroker + Send + Sync> {
&self.broker
}
pub fn other_parties(&self) -> Vec<PartyId> {
self.parties
.iter()
.enumerate()
.filter(|(i, _)| *i != self.self_index)
.map(|(_, p)| p.clone())
.collect()
}
}
#[derive(Clone)]
pub struct ReSharingParameters {
old_parties: Vec<PartyId>,
new_parties: Vec<PartyId>,
old_threshold: usize,
new_threshold: usize,
self_id: PartyId,
broker: Arc<dyn MessageBroker + Send + Sync>,
}
impl ReSharingParameters {
pub fn new(
old_parties: Vec<PartyId>,
new_parties: Vec<PartyId>,
old_threshold: usize,
new_threshold: usize,
self_id: PartyId,
broker: Arc<dyn MessageBroker + Send + Sync>,
) -> Self {
ReSharingParameters {
old_parties,
new_parties,
old_threshold,
new_threshold,
self_id,
broker,
}
}
pub fn party_id(&self) -> &PartyId {
&self.self_id
}
pub fn old_parties(&self) -> &[PartyId] {
&self.old_parties
}
pub fn new_parties(&self) -> &[PartyId] {
&self.new_parties
}
pub fn old_threshold(&self) -> usize {
self.old_threshold
}
pub fn new_threshold(&self) -> usize {
self.new_threshold
}
pub fn new_party_count(&self) -> usize {
self.new_parties.len()
}
pub fn broker(&self) -> &Arc<dyn MessageBroker + Send + Sync> {
&self.broker
}
pub fn is_old_committee(&self) -> bool {
self.old_parties
.iter()
.any(|p| p.cmp_key(&self.self_id) == std::cmp::Ordering::Equal)
}
pub fn is_new_committee(&self) -> bool {
self.new_parties
.iter()
.any(|p| p.cmp_key(&self.self_id) == std::cmp::Ordering::Equal)
}
pub fn old_index(&self) -> Option<usize> {
self.old_parties
.iter()
.position(|p| p.cmp_key(&self.self_id) == std::cmp::Ordering::Equal)
}
pub fn old_and_new_parties(&self) -> Vec<PartyId> {
let mut v = self.old_parties.clone();
v.extend(self.new_parties.iter().cloned());
v
}
}