use anyhow::Result;
use async_trait::async_trait;
use enum_dispatch::enum_dispatch;
use crate::resolve::Target;
pub mod opaque;
pub mod tcp;
pub mod tcp_reuse;
#[non_exhaustive]
#[derive(Debug)]
pub enum Transport {
Opaque,
Tcp(tokio::net::TcpStream),
}
#[async_trait]
#[enum_dispatch]
pub trait TransportFactory {
async fn setup(&self, target: &Target) -> Result<Transport>;
}
#[enum_dispatch(TransportFactory)]
#[derive(Debug, Clone)]
pub enum TransportFactoryImpl {
Opaque(opaque::TransportFactory),
Tcp(tcp::TransportFactory),
TcpReuse(tcp_reuse::TransportFactory),
}