sea_query/value/
with_chrono.rs

1use super::*;
2use chrono::{Local, Offset, Utc};
3
4type_to_value!(NaiveDate, ChronoDate, Date);
5type_to_value!(NaiveTime, ChronoTime, Time);
6type_to_value!(NaiveDateTime, ChronoDateTime, DateTime);
7
8impl DateLikeValue for NaiveDate {}
9impl TimeLikeValue for NaiveTime {}
10impl DateTimeLikeValue for NaiveDateTime {}
11impl DateTimeLikeValue for DateTime<Utc> {}
12impl DateTimeLikeValue for DateTime<Local> {}
13impl DateTimeLikeValue for DateTime<FixedOffset> {}
14
15impl DateLikeValueNullable for Option<NaiveDate> {}
16impl TimeLikeValueNullable for Option<NaiveTime> {}
17impl DateTimeLikeValueNullable for Option<NaiveDateTime> {}
18impl DateTimeLikeValueNullable for Option<DateTime<Utc>> {}
19impl DateTimeLikeValueNullable for Option<DateTime<Local>> {}
20impl DateTimeLikeValueNullable for Option<DateTime<FixedOffset>> {}
21
22impl From<DateTime<Utc>> for Value {
23    fn from(v: DateTime<Utc>) -> Value {
24        Value::ChronoDateTimeUtc(Some(v))
25    }
26}
27
28impl From<DateTime<Local>> for Value {
29    fn from(v: DateTime<Local>) -> Value {
30        Value::ChronoDateTimeLocal(Some(v))
31    }
32}
33
34impl From<DateTime<FixedOffset>> for Value {
35    fn from(x: DateTime<FixedOffset>) -> Value {
36        let v = DateTime::<FixedOffset>::from_naive_utc_and_offset(x.naive_utc(), x.offset().fix());
37        Value::ChronoDateTimeWithTimeZone(Some(v))
38    }
39}
40
41impl Nullable for DateTime<Utc> {
42    fn null() -> Value {
43        Value::ChronoDateTimeUtc(None)
44    }
45}
46
47impl ValueType for DateTime<Utc> {
48    fn try_from(v: Value) -> Result<Self, ValueTypeErr> {
49        match v {
50            Value::ChronoDateTimeUtc(Some(x)) => Ok(x),
51            _ => Err(ValueTypeErr),
52        }
53    }
54
55    fn type_name() -> String {
56        stringify!(DateTime<Utc>).to_owned()
57    }
58
59    fn array_type() -> ArrayType {
60        ArrayType::ChronoDateTimeUtc
61    }
62
63    fn column_type() -> ColumnType {
64        ColumnType::TimestampWithTimeZone
65    }
66}
67
68impl Nullable for DateTime<Local> {
69    fn null() -> Value {
70        Value::ChronoDateTimeLocal(None)
71    }
72}
73
74impl ValueType for DateTime<Local> {
75    fn try_from(v: Value) -> Result<Self, ValueTypeErr> {
76        match v {
77            Value::ChronoDateTimeLocal(Some(x)) => Ok(x),
78            _ => Err(ValueTypeErr),
79        }
80    }
81
82    fn type_name() -> String {
83        stringify!(DateTime<Local>).to_owned()
84    }
85
86    fn array_type() -> ArrayType {
87        ArrayType::ChronoDateTimeLocal
88    }
89
90    fn column_type() -> ColumnType {
91        ColumnType::TimestampWithTimeZone
92    }
93}
94
95impl Nullable for DateTime<FixedOffset> {
96    fn null() -> Value {
97        Value::ChronoDateTimeWithTimeZone(None)
98    }
99}
100
101impl ValueType for DateTime<FixedOffset> {
102    fn try_from(v: Value) -> Result<Self, ValueTypeErr> {
103        match v {
104            Value::ChronoDateTimeWithTimeZone(Some(x)) => Ok(x),
105            _ => Err(ValueTypeErr),
106        }
107    }
108
109    fn type_name() -> String {
110        stringify!(DateTime<FixedOffset>).to_owned()
111    }
112
113    fn array_type() -> ArrayType {
114        ArrayType::ChronoDateTimeWithTimeZone
115    }
116
117    fn column_type() -> ColumnType {
118        ColumnType::TimestampWithTimeZone
119    }
120}
121
122impl Value {
123    pub fn is_chrono_date(&self) -> bool {
124        matches!(self, Self::ChronoDate(_))
125    }
126
127    pub fn is_chrono_time(&self) -> bool {
128        matches!(self, Self::ChronoTime(_))
129    }
130
131    pub fn is_chrono_date_time(&self) -> bool {
132        matches!(self, Self::ChronoDateTime(_))
133    }
134
135    pub fn is_chrono_date_time_utc(&self) -> bool {
136        matches!(self, Self::ChronoDateTimeUtc(_))
137    }
138
139    pub fn is_chrono_date_time_with_time_zone(&self) -> bool {
140        matches!(self, Self::ChronoDateTimeWithTimeZone(_))
141    }
142
143    pub fn is_chrono_date_time_local(&self) -> bool {
144        matches!(self, Self::ChronoDateTimeLocal(_))
145    }
146
147    pub fn as_ref_chrono_date(&self) -> Option<&NaiveDate> {
148        match self {
149            Self::ChronoDate(v) => v.as_ref(),
150            _ => panic!("not Value::ChronoDate"),
151        }
152    }
153
154    pub fn as_ref_chrono_time(&self) -> Option<&NaiveTime> {
155        match self {
156            Self::ChronoTime(v) => v.as_ref(),
157            _ => panic!("not Value::ChronoTime"),
158        }
159    }
160
161    pub fn as_ref_chrono_date_time(&self) -> Option<&NaiveDateTime> {
162        match self {
163            Self::ChronoDateTime(v) => v.as_ref(),
164            _ => panic!("not Value::ChronoDateTime"),
165        }
166    }
167
168    pub fn as_ref_chrono_date_time_utc(&self) -> Option<&DateTime<Utc>> {
169        match self {
170            Self::ChronoDateTimeUtc(v) => v.as_ref(),
171            _ => panic!("not Value::ChronoDateTimeUtc"),
172        }
173    }
174
175    pub fn as_ref_chrono_date_time_with_time_zone(&self) -> Option<&DateTime<FixedOffset>> {
176        match self {
177            Self::ChronoDateTimeWithTimeZone(v) => v.as_ref(),
178            _ => panic!("not Value::ChronoDateTimeWithTimeZone"),
179        }
180    }
181
182    pub fn as_ref_chrono_date_time_local(&self) -> Option<&DateTime<Local>> {
183        match self {
184            Self::ChronoDateTimeLocal(v) => v.as_ref(),
185            _ => panic!("not Value::ChronoDateTimeLocal"),
186        }
187    }
188
189    pub fn chrono_as_naive_utc_in_string(&self) -> Option<String> {
190        match self {
191            Self::ChronoDate(v) => v.as_ref().map(|v| v.to_string()),
192            Self::ChronoTime(v) => v.as_ref().map(|v| v.to_string()),
193            Self::ChronoDateTime(v) => v.as_ref().map(|v| v.to_string()),
194            Self::ChronoDateTimeUtc(v) => v.as_ref().map(|v| v.naive_utc().to_string()),
195            Self::ChronoDateTimeLocal(v) => v.as_ref().map(|v| v.naive_utc().to_string()),
196            Self::ChronoDateTimeWithTimeZone(v) => v.as_ref().map(|v| v.naive_utc().to_string()),
197            _ => panic!("not chrono Value"),
198        }
199    }
200}