Provide times as unix seconds for all --json outputs
Build and test / build (push) Successful in 1m40s
Build and test / test (push) Successful in 2m12s
Build and test / check (push) Successful in 2m15s
Build and test / docs (push) Successful in 4m17s

This commit is contained in:
2026-07-20 19:08:45 +09:00
parent a89deefceb
commit 07d13de6a5
5 changed files with 62 additions and 7 deletions
+38
View File
@@ -0,0 +1,38 @@
pub mod duration_seconds {
use chrono::TimeDelta;
use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
pub fn serialize<S: Serializer>(
duration: &TimeDelta,
serializer: S,
) -> Result<S::Ok, S::Error> {
duration.num_seconds().serialize(serializer)
}
pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<TimeDelta, D::Error> {
let secs = i64::deserialize(deserializer)?;
TimeDelta::try_seconds(secs).ok_or_else(|| Error::custom("duration out of range"))
}
}
pub mod duration_seconds_option {
use chrono::TimeDelta;
use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
pub fn serialize<S: Serializer>(
duration: &Option<TimeDelta>,
serializer: S,
) -> Result<S::Ok, S::Error> {
duration.map(|d| d.num_seconds()).serialize(serializer)
}
pub fn deserialize<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<Option<TimeDelta>, D::Error> {
let secs = Option::<i64>::deserialize(deserializer)?;
secs.map(|secs| {
TimeDelta::try_seconds(secs).ok_or_else(|| Error::custom("duration out of range"))
})
.transpose()
}
}