helloasso-paheko-adapter/src/utils.rs

46 lines
1.1 KiB
Rust
Raw Normal View History

2023-12-26 15:09:49 +00:00
use serde::{Serialize, Deserialize, Deserializer};
2023-12-27 00:03:33 +00:00
use std::fmt;
2023-12-21 16:31:21 +00:00
use rand::{thread_rng, Rng};
2024-01-13 16:51:06 +00:00
use chrono::prelude::{DateTime, Utc, NaiveDate};
2023-12-21 16:31:21 +00:00
/// ID
#[derive(Clone, Deserialize, Serialize, Debug, PartialEq, Eq, Hash)]
pub struct Id(pub u64);
2023-12-28 10:40:38 +00:00
2023-12-21 16:31:21 +00:00
impl Into<String> for Id {
fn into(self) -> String {
format!("{:x}", self.0)
}
}
2023-12-27 00:03:33 +00:00
impl fmt::Display for Id {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
2023-12-21 16:31:21 +00:00
pub fn generate_id() -> Id {
Id(thread_rng().gen())
}
2023-12-26 15:09:49 +00:00
2024-01-13 16:51:06 +00:00
/// https://serde.rs/field-attrs.html
2023-12-26 15:09:49 +00:00
pub fn deserialize_datetime<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
DateTime::parse_from_rfc3339(&s)
.map_err(serde::de::Error::custom)
.map(|dt| dt.with_timezone(&Utc))
}
2024-01-13 16:51:06 +00:00
pub fn deserialize_date<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
NaiveDate::parse_from_str(&s, "%Y-%m-%d")
.map_err(serde::de::Error::custom)
}