use crate::transport::{Transport, TransportError};
use multiaddr::Multiaddr;
#[derive(Debug, Copy, Clone)]
pub struct OptionalTransport<T>(Option<T>);
impl<T> OptionalTransport<T> {
pub fn some(inner: T) -> OptionalTransport<T> {
OptionalTransport(Some(inner))
}
pub fn none() -> OptionalTransport<T> {
OptionalTransport(None)
}
}
impl<T> From<T> for OptionalTransport<T> {
fn from(inner: T) -> Self {
OptionalTransport(Some(inner))
}
}
impl<T> Transport for OptionalTransport<T>
where
T: Transport,
{
type Output = T::Output;
type Error = T::Error;
type Listener = T::Listener;
type ListenerUpgrade = T::ListenerUpgrade;
type Dial = T::Dial;
fn listen_on(self, addr: Multiaddr) -> Result<Self::Listener, TransportError<Self::Error>> {
if let Some(inner) = self.0 {
inner.listen_on(addr)
} else {
Err(TransportError::MultiaddrNotSupported(addr))
}
}
fn dial(self, addr: Multiaddr) -> Result<Self::Dial, TransportError<Self::Error>> {
if let Some(inner) = self.0 {
inner.dial(addr)
} else {
Err(TransportError::MultiaddrNotSupported(addr))
}
}
}