use crate::{system::System, template::Template};
use serde::{Deserialize, Deserializer};
use std::time::Duration;
const DEFAULT_GIT_REFRESH_SECONDS: u64 = 3600 * 24 * 3;
const DEFAULT_PACKAGE_REFRESH_SECONDS: u64 = 3600;
#[derive(Deserialize, Default, Debug, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct Config {
#[serde(default = "default_git_refresh", deserialize_with = "human_duration")]
pub git_refresh: Duration,
#[serde(
default = "default_package_refresh",
deserialize_with = "human_duration"
)]
pub package_refresh: Duration,
pub hierarchy: Vec<Template>,
pub systems: Vec<System>,
}
fn default_git_refresh() -> Duration {
Duration::from_secs(DEFAULT_GIT_REFRESH_SECONDS)
}
fn default_package_refresh() -> Duration {
Duration::from_secs(DEFAULT_PACKAGE_REFRESH_SECONDS)
}
pub fn human_duration<'de, D>(deserializer: D) -> Result<Duration, D::Error>
where
D: Deserializer<'de>,
{
let string = String::deserialize(deserializer)?;
humantime::parse_duration(&string).map_err(serde::de::Error::custom)
}