use duration_str;
use serde::Deserialize;
use std::time::Duration;
#[derive(Debug, Clone, Deserialize, Eq, PartialEq, bon::Builder)]
pub struct JwksCacheConfig {
#[serde(default)]
#[builder(default = true, setters(vis = ""))]
pub enabled: bool,
#[serde(
default = "default_expiration_duration",
deserialize_with = "duration_str::deserialize_duration"
)]
#[builder(default = default_expiration_duration())]
pub expiration_duration: Duration,
#[serde(default, deserialize_with = "deserialize_optional_duration")]
pub background_refresh_interval: Option<Duration>,
#[serde(default)]
#[builder(default = false)]
pub reload_on_jwk_not_found: bool,
}
impl Default for JwksCacheConfig {
fn default() -> JwksCacheConfig {
JwksCacheConfig {
enabled: false,
expiration_duration: default_expiration_duration(),
background_refresh_interval: None,
reload_on_jwk_not_found: false,
}
}
}
pub const fn default_expiration_duration() -> Duration {
Duration::from_secs(60 * 5)
}
fn deserialize_optional_duration<'de, D>(deserializer: D) -> Result<Option<Duration>, D::Error>
where
D: serde::Deserializer<'de>,
{
let opt_str: Option<String> = Option::deserialize(deserializer)?;
match opt_str {
Some(s) => duration_str::parse_std(&s)
.map(Some)
.map_err(serde::de::Error::custom),
None => Ok(None),
}
}