use super::{peer::PeersFactory, TestFactory, TestFactoryError};
use crate::{
peer_manager::{Peer, PeerManager},
types::{CommsDatabase, TransportProtocol},
};
pub fn create() -> PeerManagerFactory {
PeerManagerFactory::default()
}
#[derive(Default)]
pub struct PeerManagerFactory {
peers_factory: PeersFactory,
peers: Option<Vec<Peer>>,
database: Option<CommsDatabase>,
}
impl PeerManagerFactory {
factory_setter!(with_peers_factory, peers_factory, PeersFactory);
factory_setter!(with_peers, peers, Option<Vec<Peer>>);
factory_setter!(with_database, database, Option<CommsDatabase>);
}
impl TestFactory for PeerManagerFactory {
type Object = PeerManager;
fn build(self) -> Result<Self::Object, TestFactoryError> {
let database = self
.database
.ok_or_else(|| TestFactoryError::BuildFailed("Failed to build peer manager: database undefined".into()))?;
let pm = PeerManager::new(database, TransportProtocol::get_all())
.map_err(|err| TestFactoryError::BuildFailed(format!("Failed to build peer manager: {:?}", err)))?;
let peers = self
.peers
.or(self.peers_factory.build().ok())
.ok_or_else(|| TestFactoryError::BuildFailed("Failed to build peers".into()))?;
for peer in peers {
futures::executor::block_on(pm.add_or_update_peer(peer))
.map_err(|err| TestFactoryError::BuildFailed(format!("Failed to build peer manager: {:?}", err)))?;
}
Ok(pm)
}
}