use std::time::Duration;
use structio::{ErrorCode, Options, from_str, json, to_string};
struct Millis;
impl<'de> json::ReadAs<'de, Duration> for Millis {
fn read<O: Options>(
value: &mut Duration,
p: &mut json::Parser<'de, O>,
) -> Result<(), ErrorCode> {
let mut ms = 0u64;
json::Read::read(&mut ms, p)?;
*value = Duration::from_millis(ms);
Ok(())
}
}
impl json::WriteAs<Duration> for Millis {
fn write<O: Options>(value: &Duration, w: &mut json::Writer<'_, O>) {
json::Write::write(&(value.as_millis() as u64), w);
}
}
#[derive(Default, Debug, PartialEq)]
struct Job {
id: u32,
elapsed: Duration,
timeout: Option<Duration>,
retries: Vec<Duration>,
}
structio::json_object!(Job {
id,
"elapsed_ms" => elapsed as Millis,
timeout as Option<Millis>,
retries as Vec<Millis>,
});
fn main() {
let job = Job {
id: 42,
elapsed: Duration::from_millis(1500),
timeout: None,
retries: vec![Duration::from_millis(100), Duration::from_millis(400)],
};
let text = to_string(&job);
println!("{text}");
assert_eq!(
text,
r#"{"id":42,"elapsed_ms":1500,"timeout":null,"retries":[100,400]}"#
);
let back: Job = from_str(&text).unwrap();
assert_eq!(back, job);
}