use std::collections::HashMap;
use std::time::Duration;
use serde::de::Error;
use serde::{Deserialize, Deserializer};
pub fn deserialize_milliseconds_to_duration<'de, D>(de: D) -> Result<Duration, D::Error>
where
D: Deserializer<'de>,
{
let millis: u64 = Deserialize::deserialize(de)?;
Ok(Duration::from_millis(millis))
}
pub fn deserialize_seconds_to_duration<'de, D>(de: D) -> Result<Duration, D::Error>
where
D: Deserializer<'de>,
{
let secs: u64 = Deserialize::deserialize(de)?;
Ok(Duration::from_secs(secs))
}
pub fn serialize_optional_map(optional_map: &Option<HashMap<String, String>>) -> String {
match optional_map {
None => "".to_owned(),
Some(map) => map.iter().map(|(k, v)| format!("{k}:{v}")).collect::<Vec<String>>().join(" "),
}
}
pub fn deserialize_optional_map<'de, D>(de: D) -> Result<Option<HashMap<String, String>>, D::Error>
where
D: Deserializer<'de>,
{
let raw_str: String = Deserialize::deserialize(de)?;
if raw_str.is_empty() {
return Ok(None);
}
let mut map = HashMap::new();
for raw_pair in raw_str.split(' ') {
let split: Vec<&str> = raw_pair.split(':').collect();
if split.len() != 2 {
return Err(D::Error::custom(format!(
"pair \"{raw_pair}\" is not valid. The Expected format is name:value"
)));
}
map.insert(split[0].to_string(), split[1].to_string());
}
Ok(Some(map))
}