use duration_string::DurationString;
use serde::Deserialize;
use std::{
net::{IpAddr, Ipv4Addr, SocketAddr},
path::PathBuf,
time::Duration,
};
pub const DEFAULT_CONFIG_PATH: &str = "/var/lib/geoprox";
#[derive(Clone, Debug, Deserialize)]
pub struct SnapshotConfig {
#[serde(default)]
pub disabled: bool,
pub path: Option<PathBuf>,
pub every: Option<DurationString>,
}
impl SnapshotConfig {
pub const SNAPSHOT_FILENAME: &'static str = "snapshot.bin";
fn default_path() -> PathBuf {
PathBuf::from(DEFAULT_CONFIG_PATH).join("snapshots")
}
pub fn bin_path(&self) -> PathBuf {
self.path
.clone()
.unwrap_or(Self::default_path())
.join(Self::SNAPSHOT_FILENAME)
}
}
impl Default for SnapshotConfig {
fn default() -> Self {
Self {
disabled: false,
path: Some(Self::default_path()),
every: Some(DurationString::default()),
}
}
}
#[derive(Clone, Debug, Deserialize)]
pub struct ServerConfig {
pub http_addr: Option<IpAddr>,
pub http_port: Option<u16>,
pub timeout: Option<DurationString>,
pub snapshots: SnapshotConfig,
}
impl ServerConfig {
pub const DEFAULT_ADDR: IpAddr = IpAddr::V4(Ipv4Addr::UNSPECIFIED);
pub const DEFAULT_PORT: u16 = 5000;
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
http_addr: Some(Self::DEFAULT_ADDR),
http_port: Some(Self::DEFAULT_PORT),
timeout: Some(DurationString::new(Duration::from_secs(10))),
snapshots: SnapshotConfig::default(),
}
}
}
impl From<ServerConfig> for SocketAddr {
fn from(config: ServerConfig) -> Self {
SocketAddr::new(
config.http_addr.unwrap_or(ServerConfig::DEFAULT_ADDR),
config.http_port.unwrap_or(ServerConfig::DEFAULT_PORT),
)
}
}