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};
|
2023-12-26 15:09:49 +00:00
|
|
|
use chrono::prelude::{DateTime, Utc};
|
2023-12-21 16:31:21 +00:00
|
|
|
|
|
|
|
/// ID
|
|
|
|
#[derive(Clone, Deserialize, Serialize, Debug, PartialEq, Eq, Hash)]
|
|
|
|
pub struct Id(pub u64);
|
|
|
|
impl Id {
|
|
|
|
pub fn to_string(&self) -> String {
|
|
|
|
format!("{:x}", self.0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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
|
|
|
|
|
|
|
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))
|
|
|
|
}
|