matchmaker/utils/
serde.rs1#![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}