basic_quick_lib/
time.rs

1use std::ops::{Deref, DerefMut};
2
3use chrono::{DateTime, Datelike, Local};
4use serde::{de::Visitor, Deserialize, Serialize};
5
6#[derive(Debug, Clone)]
7pub struct LocalTime(pub DateTime<Local>);
8
9impl LocalTime {
10  pub fn to_date_string(&self) -> String {
11    format!("{:02}-{:02}-{:04}", self.month(), self.day(), self.year())
12  }
13}
14
15impl Deref for LocalTime {
16  type Target = DateTime<Local>;
17
18  fn deref(&self) -> &Self::Target {
19    &self.0
20  }
21}
22
23impl DerefMut for LocalTime {
24  fn deref_mut(&mut self) -> &mut Self::Target {
25    &mut self.0
26  }
27}
28
29impl Serialize for LocalTime {
30  fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
31  where
32    S: serde::Serializer,
33  {
34    serializer.serialize_str(&self.to_rfc3339())
35  }
36}
37
38struct LocalTimeVisitor;
39
40impl<'de> Visitor<'de> for LocalTimeVisitor {
41  type Value = LocalTime;
42
43  fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
44    write!(formatter, "a string")
45  }
46
47  fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
48  where
49    E: serde::de::Error,
50  {
51    let parsed_time = match DateTime::parse_from_rfc3339(v) {
52      Ok(v) => v,
53      Err(err) => {
54        return Err(E::custom(format!("failed to parse date. Err: {}", err)))
55      }
56    };
57    Ok(LocalTime(DateTime::<Local>::from(parsed_time)))
58  }
59}
60
61impl<'de> Deserialize<'de> for LocalTime {
62  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
63  where
64    D: serde::Deserializer<'de>,
65  {
66    deserializer.deserialize_str(LocalTimeVisitor)
67  }
68}