use std::{net::IpAddr, time::Duration};
use pipenet::Versions;
#[derive(Clone, Debug)]
pub struct Config {
pub address: Option<IpAddr>,
pub port: u16,
pub versions: Versions,
pub accept_timeout: Duration,
#[cfg(feature = "compression")]
pub compress: bool,
#[cfg(feature = "encryption")]
pub key: Option<Vec<u8>>,
}
impl From<&str> for Config {
fn from(value: &str) -> Self {
let mut config = Config::default();
let mut colons = value.split(':');
config.address = colons.next().and_then(|s| s.parse().ok());
let after = colons.next().expect("no port provided");
let mut with_options = after.split('+');
config.port = with_options
.next()
.and_then(|s| s.parse().ok())
.expect("invalid port");
#[cfg(feature = "compression")]
if let Some(o) = with_options.next()
&& o == "C"
{
config.compress = true;
}
#[cfg(feature = "encryption")]
if let Some(o) = with_options.next() {
config.key = Some(o.bytes().collect::<Vec<_>>());
}
config
}
}
impl Default for Config {
fn default() -> Self {
Self {
address: Option::default(),
port: u16::MAX,
versions: Versions::default(),
accept_timeout: Duration::from_secs(5),
#[cfg(feature = "compression")]
compress: Default::default(),
#[cfg(feature = "encryption")]
key: Option::default(),
}
}
}
#[cfg(feature = "encryption")]
impl Drop for Config {
fn drop(&mut self) {
let Some(k) = self.key.as_mut() else {
return;
};
for b in k.iter_mut() {
*b = 0;
}
}
}