Skip to main content

matchmaker/utils/
serde.rs

1#![allow(unused)]
2use cli_boilerplate_automation::wbog;
3use serde::{Deserialize, Deserializer, Serialize, de};
4
5use crate::utils::text::parse_escapes;
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8#[serde(untagged)]
9pub enum StringOrVec {
10    String(String),
11    Vec(Vec<String>),
12}
13impl Default for StringOrVec {
14    fn default() -> Self {
15        StringOrVec::String(String::new())
16    }
17}
18
19pub fn bounded_usize<'de, const MAX: usize, D>(d: D) -> Result<usize, D::Error>
20where
21    D: Deserializer<'de>,
22{
23    let v = usize::deserialize(d)?;
24    if v > MAX {
25        wbog!("{} exceeded the the limit of {} and was clamped.", v, MAX);
26        Ok(MAX)
27    } else {
28        Ok(v)
29    }
30}
31
32pub fn escaped_opt_string<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
33where
34    D: serde::Deserializer<'de>,
35{
36    let opt = Option::<String>::deserialize(deserializer)?;
37    Ok(opt.map(|s| parse_escapes(&s)))
38}
39
40pub fn escaped_opt_char<'de, D>(deserializer: D) -> Result<Option<char>, D::Error>
41where
42    D: serde::Deserializer<'de>,
43{
44    let opt = Option::<String>::deserialize(deserializer)?;
45    match opt {
46        Some(s) => {
47            let parsed = parse_escapes(&s);
48            let mut chars = parsed.chars();
49            let first = chars
50                .next()
51                .ok_or_else(|| serde::de::Error::custom("escaped string is empty"))?;
52            if chars.next().is_some() {
53                return Err(serde::de::Error::custom(
54                    "escaped string must be exactly one character",
55                ));
56            }
57            Ok(Some(first))
58        }
59        None => Ok(None),
60    }
61}
62
63pub mod serde_duration_ms {
64    use serde::{Deserialize, Deserializer, Serializer};
65    use std::time::Duration;
66
67    pub fn serialize<S>(duration: &Duration, serializer: S) -> Result<S::Ok, S::Error>
68    where
69        S: Serializer,
70    {
71        let ms = duration.as_millis() as u64;
72        serializer.serialize_u64(ms)
73    }
74
75    pub fn deserialize<'de, D>(deserializer: D) -> Result<Duration, D::Error>
76    where
77        D: Deserializer<'de>,
78    {
79        let ms = u64::deserialize(deserializer)?;
80        Ok(Duration::from_millis(ms))
81    }
82}
83
84pub fn uppercase(s: &str) -> String {
85    s.to_uppercase()
86}