use std::iter::repeat_with;
use multiaddr::Multiaddr;
use super::{TestFactory, TestFactoryError};
use crate::transports::MemoryTransport;
pub fn create_many(n: usize) -> NetAddressesFactory {
NetAddressesFactory::default().with_count(n)
}
pub fn create() -> NetAddressFactory {
NetAddressFactory::default()
}
#[derive(Default, Clone)]
pub struct NetAddressesFactory {
count: Option<usize>,
net_address_factory: NetAddressFactory,
}
impl NetAddressesFactory {
factory_setter!(with_count, count, Option<usize>);
factory_setter!(with_net_address_factory, net_address_factory, NetAddressFactory);
fn make_one(&self) -> Multiaddr {
self.net_address_factory.clone().build().unwrap()
}
}
impl TestFactory for NetAddressesFactory {
type Object = Vec<Multiaddr>;
fn build(self) -> Result<Self::Object, TestFactoryError> {
Ok(repeat_with(|| self.make_one()).take(self.count.unwrap_or(1)).collect())
}
}
#[derive(Clone, Default)]
pub struct NetAddressFactory {
port: Option<u16>,
is_use_os_port: bool,
}
impl NetAddressFactory {
factory_setter!(with_port, port, Option<u16>);
pub fn use_os_port(mut self) -> Self {
self.is_use_os_port = true;
self
}
}
impl TestFactory for NetAddressFactory {
type Object = Multiaddr;
fn build(self) -> Result<Self::Object, TestFactoryError> {
let port = self.port.unwrap_or_else(|| {
if self.is_use_os_port {
0
} else {
MemoryTransport::acquire_next_memsocket_port().get()
}
});
format!("/memory/{port}")
.parse()
.map_err(TestFactoryError::build_failed())
}
}