use std::error::Error;
use std::fmt;
use std::net::{AddrParseError, IpAddr, Ipv6Addr, SocketAddr};
use std::str::FromStr;
use crate::cli;
#[derive(Debug)]
pub enum HostParseError {
AddrParse(AddrParseError),
NoHostName,
}
pub fn parse_socket_addr(cli: &cli::Cli) -> Result<SocketAddr, HostParseError> {
let port = parse_port(cli.port);
match &cli.hostname {
None => {
if cli.listen {
Ok(SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), port))
} else {
Err(HostParseError::NoHostName)
}
}
Some(hostname) => Ok(SocketAddr::from_str(&format!("{}:{}", hostname, port))?),
}
}
fn parse_port(port: Option<u16>) -> u16 {
match port {
Some(port) => port,
None => 31337,
}
}
impl Error for HostParseError {}
impl fmt::Display for HostParseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
HostParseError::AddrParse(e) => write!(f, "AddrParseError: {}", e),
HostParseError::NoHostName => write!(f, "No hostname specified"),
}
}
}
impl From<AddrParseError> for HostParseError {
fn from(error: AddrParseError) -> Self {
HostParseError::AddrParse(error)
}
}