square_api_client/models/
date_time.rs1use std::fmt::{Debug, Display};
4
5use chrono::Utc;
6use log::error;
7use serde::{Deserialize, Serialize};
8
9use super::errors::ApiError;
10
11#[derive(Clone, Eq, PartialEq)]
18pub struct DateTime {
19 inner: chrono::DateTime<Utc>,
20}
21
22impl DateTime {
23 pub fn new() -> Self {
27 Self::now()
28 }
29
30 pub fn now() -> Self {
34 Self {
35 inner: chrono::offset::Utc::now(),
36 }
37 }
38}
39
40impl Debug for DateTime {
41 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43 std::fmt::Debug::fmt(&self.inner, f)
44 }
45}
46
47impl Default for DateTime {
48 fn default() -> Self {
52 Self::now()
53 }
54}
55
56impl<'de> Deserialize<'de> for DateTime {
57 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
59 where
60 D: serde::Deserializer<'de>,
61 {
62 Ok(Self {
63 inner: chrono::DateTime::deserialize(deserializer)?,
64 })
65 }
66}
67
68impl Display for DateTime {
69 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70 std::fmt::Display::fmt(&self.inner, f)
71 }
72}
73
74impl From<&chrono::DateTime<Utc>> for DateTime {
75 fn from(dt: &chrono::DateTime<Utc>) -> Self {
77 Self {
78 inner: dt.to_owned(),
79 }
80 }
81}
82
83impl From<i64> for DateTime {
84 fn from(timestamp: i64) -> Self {
86 Self::from(&chrono::DateTime::<Utc>::from_utc(
87 chrono::NaiveDateTime::from_timestamp(timestamp, 0),
88 Utc,
89 ))
90 }
91}
92
93impl Serialize for DateTime {
94 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
96 where
97 S: serde::Serializer,
98 {
99 self.inner.serialize(serializer)
100 }
101}
102
103impl TryFrom<&str> for DateTime {
104 type Error = ApiError;
105
106 fn try_from(rfc3339: &str) -> Result<Self, Self::Error> {
110 let inner = chrono::DateTime::parse_from_rfc3339(rfc3339).map_err(|e| {
111 let msg = format!("Error parsing RFC3339 DateTime string: {}: {}", rfc3339, e);
112 error!("{}", &msg);
113 Self::Error::new(&msg)
114 })?;
115 let inner = inner.with_timezone(&chrono::offset::Utc);
116 Ok(Self { inner })
117 }
118}