use std::time::Duration;
const DEFAULT_RATE: f64 = 0.0;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(any(feature = "serde", test), derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct LatencyConfig {
pub enabled: bool,
pub rate: f64,
#[cfg_attr(
any(feature = "serde", test),
serde(with = "jiff::fmt::serde::unsigned_duration::friendly::compact::required")
)]
pub latency: Duration,
#[cfg_attr(
any(feature = "serde", test),
serde(default, with = "jiff::fmt::serde::unsigned_duration::friendly::compact::optional")
)]
pub max_latency: Option<Duration>,
}
impl Default for LatencyConfig {
fn default() -> Self {
Self {
enabled: true,
rate: DEFAULT_RATE,
latency: Duration::ZERO,
max_latency: None,
}
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[cfg_attr(miri, ignore)]
fn default_snapshot() {
let config = LatencyConfig::default();
insta::assert_json_snapshot!(config);
}
#[test]
fn serde_roundtrip() {
let config = LatencyConfig {
enabled: false,
rate: 0.42,
latency: Duration::from_millis(100),
max_latency: Some(Duration::from_millis(500)),
};
let json = serde_json::to_string(&config).unwrap();
let deserialized: LatencyConfig = serde_json::from_str(&json).unwrap();
assert_eq!(config, deserialized);
}
#[test]
fn serde_roundtrip_without_max() {
let config = LatencyConfig {
enabled: true,
rate: 0.5,
latency: Duration::from_millis(200),
max_latency: None,
};
let json = serde_json::to_string(&config).unwrap();
let deserialized: LatencyConfig = serde_json::from_str(&json).unwrap();
assert_eq!(config, deserialized);
}
}