pub mod duration_secs {
use serde::{Deserialize, Deserializer, Serializer};
use std::time::Duration;
pub fn serialize<S: Serializer>(value: &Duration, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_u64(value.as_secs())
}
pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Duration, D::Error> {
let secs = u64::deserialize(deserializer)?;
Ok(Duration::from_secs(secs))
}
}
#[cfg(test)]
mod config_serde_tests {
use super::duration_secs;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
struct Wrapper {
#[serde(with = "duration_secs")]
cooldown: Duration,
}
#[test]
fn config_serde_duration_roundtrip() {
let original = Wrapper {
cooldown: Duration::from_secs(3600),
};
let json = serde_json::to_string(&original).expect("serialize should succeed");
assert_eq!(json, r#"{"cooldown":3600}"#);
let restored: Wrapper = serde_json::from_str(&json).expect("deserialize should succeed");
assert_eq!(restored, original);
assert_eq!(restored.cooldown, Duration::from_secs(3600));
}
#[test]
fn config_serde_duration_drops_subsecond() {
let original = Wrapper {
cooldown: Duration::from_millis(1500),
};
let json = serde_json::to_string(&original).expect("serialize should succeed");
assert_eq!(json, r#"{"cooldown":1}"#);
}
}