use std::collections::BTreeMap;
use std::marker::PhantomData;
use std::sync::Arc;
use serde::{de::DeserializeOwned, Serialize};
use super::{EncryptionSchedule, HoneyBadger, Params, SubsetHandlingStrategy};
use crate::{Contribution, NetworkInfo, NodeIdT};
pub struct HoneyBadgerBuilder<C, N> {
netinfo: Arc<NetworkInfo<N>>,
session_id: u64,
epoch: u64,
params: Params,
_phantom: PhantomData<C>,
}
impl<C, N> HoneyBadgerBuilder<C, N>
where
C: Contribution + Serialize + DeserializeOwned,
N: NodeIdT,
{
pub fn new(netinfo: Arc<NetworkInfo<N>>) -> Self {
HoneyBadgerBuilder {
netinfo,
session_id: 0,
epoch: 0,
params: Params::default(),
_phantom: PhantomData,
}
}
pub fn session_id(&mut self, session_id: u64) -> &mut Self {
self.session_id = session_id;
self
}
pub fn epoch(&mut self, epoch: u64) -> &mut Self {
self.epoch = epoch;
self
}
pub fn max_future_epochs(&mut self, max_future_epochs: u64) -> &mut Self {
self.params.max_future_epochs = max_future_epochs;
self
}
pub fn subset_handling_strategy(
&mut self,
subset_handling_strategy: SubsetHandlingStrategy,
) -> &mut Self {
self.params.subset_handling_strategy = subset_handling_strategy;
self
}
pub fn encryption_schedule(&mut self, encryption_schedule: EncryptionSchedule) -> &mut Self {
self.params.encryption_schedule = encryption_schedule;
self
}
pub fn params(&mut self, params: Params) -> &mut Self {
self.params = params;
self
}
pub fn build(&mut self) -> HoneyBadger<C, N> {
HoneyBadger {
netinfo: self.netinfo.clone(),
session_id: self.session_id,
epoch: self.epoch,
has_input: false,
epochs: BTreeMap::new(),
params: self.params.clone(),
}
}
}