use std::io;
use serde::Deserialize;
use tokio::net::TcpStream;
use crate::core::{ReadHalf, WriteHalf};
use super::{DialedHalves, Dialer};
#[derive(Clone, Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct TcpDialConfig {
#[serde(rename = "Address")]
pub address: String,
#[serde(rename = "Network", default)]
pub network: Option<String>,
}
#[async_trait::async_trait]
impl Dialer for TcpDialConfig {
async fn dial(&self) -> io::Result<DialedHalves> {
let network = self.network.as_deref().unwrap_or("tcp");
match network {
"tcp" | "tcp4" | "tcp6" => {}
other => {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
format!(
"transport: TcpDialConfig.Network {other:?} is not one of tcp, tcp4, tcp6"
),
));
}
}
let socket = TcpStream::connect(&self.address).await?;
let (read_half, write_half) = socket.into_split();
Ok((ReadHalf::Tcp(read_half), WriteHalf::Tcp(write_half)))
}
}