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}