use std::{net::{IpAddr, SocketAddr}, path::PathBuf};
use getset::Getters;
use microsandbox_utils::{env, NAMESPACES_SUBDIR};
use serde::Deserialize;
use crate::{MicrosandboxServerError, MicrosandboxServerResult};
pub const PROXY_AUTH_HEADER: &str = "Proxy-Authorization";
#[derive(Debug, Deserialize, Getters)]
#[getset(get = "pub with_prefix")]
pub struct Config {
key: Option<String>,
namespace_dir: PathBuf,
dev_mode: bool,
host: IpAddr,
port: u16,
addr: SocketAddr,
}
impl Config {
pub fn new(
key: Option<String>,
host: String,
port: u16,
namespace_dir: Option<PathBuf>,
dev_mode: bool,
) -> MicrosandboxServerResult<Self> {
let key = match key {
Some(k) => Some(k),
None if dev_mode => None,
None => {
return Err(MicrosandboxServerError::ConfigError(
"No key provided. A key is required when not in dev mode".to_string(),
));
}
};
let host_ip: IpAddr = host.parse().map_err(|_| {
MicrosandboxServerError::ConfigError(format!("Invalid host address: {}", host))
})?;
let addr = SocketAddr::new(host_ip, port);
let namespace_dir = namespace_dir
.unwrap_or_else(|| env::get_microsandbox_home_path().join(NAMESPACES_SUBDIR));
Ok(Self {
key,
namespace_dir,
dev_mode,
host: host_ip,
port,
addr,
})
}
}