sea_query/value/
with_chrono.rs1use 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}