1use byte_unit::Byte;
2use duration_str::parse as parse_duration;
3use serde::{Deserialize, Serialize};
4use std::{str::FromStr, time::Duration};
5
6#[derive(Debug, Clone, Serialize)]
7pub struct TimeConfig {
8 pub parsed: Duration,
9 pub raw: String,
10}
11
12impl<'de> Deserialize<'de> for TimeConfig {
13 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
14 where
15 D: serde::Deserializer<'de>,
16 {
17 use serde::de::Error;
18
19 let raw = String::deserialize(deserializer)?;
20 let parsed = parse_duration(&raw).map_err(Error::custom)?;
21
22 Ok(TimeConfig { parsed, raw })
23 }
24}
25
26#[derive(Debug, Clone, Serialize)]
27pub struct ByteConfig {
28 pub parsed: usize,
29 pub raw: String,
30}
31
32impl<'de> Deserialize<'de> for ByteConfig {
33 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
34 where
35 D: serde::Deserializer<'de>,
36 {
37 use serde::de::Error;
38
39 let raw = String::deserialize(deserializer)?;
40 let byte = Byte::from_str(&raw).map_err(Error::custom)?;
41 let parsed = byte.as_u64() as usize;
42
43 Ok(ByteConfig { parsed, raw })
44 }
45}