#[cfg(feature = "clap")]
use alloc::string::ToString;
#[cfg(any(feature = "std", feature = "clap"))]
use alloc::{format, string::String};
use bon::Builder;
use core::time::Duration;
#[cfg(feature = "clap")]
const HELP_MAX_AGE: &str = r#"Maximum acceptable cache age.
Use a positive duration such as 1h, 7d, or "1m 30s".
If omitted, the default is module-specific."#;
#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Builder)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[builder(derive(Debug))]
#[cfg_attr(feature = "clap", derive(clap::Args))]
#[cfg_attr(feature = "clap", command(about = None, long_about = None))]
pub struct CachingOptions {
#[cfg_attr(
feature = "clap",
clap(
long,
value_name = "DURATION",
value_parser = parse_max_age,
help = "Maximum acceptable cache age",
long_help = HELP_MAX_AGE
)
)]
#[cfg_attr(
feature = "serde",
serde(
rename = "max-age",
alias = "max_age",
alias = "maxAge",
default,
skip_serializing_if = "Option::is_none",
with = "crate::serialization::optional_duration"
)
)]
pub max_age: Option<Duration>,
}
#[cfg(any(feature = "std", feature = "clap"))]
impl CachingOptions {
pub fn max_age_option(&self) -> Option<String> {
self.max_age
.map(|value| format!("--max-age={}", humantime::format_duration(value)))
}
}
#[cfg(feature = "clap")]
fn parse_max_age(value: &str) -> Result<Duration, String> {
let duration = humantime::parse_duration(value).map_err(|error| error.to_string())?;
if duration.is_zero() {
return Err("max age must be positive".into());
}
Ok(duration)
}