Skip to main content

sword_layers/
utils.rs

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}