Skip to main content

sea_query/value/
with_jiff.rs

1use super::*;
2use jiff::{Timestamp, civil};
3
4type_to_value!(civil::Date, JiffDate, Date);
5type_to_value!(civil::Time, JiffTime, Time);
6type_to_box_value!(civil::DateTime, JiffDateTime, Timestamp);
7type_to_box_value!(Timestamp, JiffTimestamp, TimestampWithTimeZone);
8
9impl DateLikeValue for civil::Date {}
10impl TimeLikeValue for civil::Time {}
11impl DateTimeLikeValue for civil::DateTime {}
12impl DateTimeLikeValue for Timestamp {}
13
14impl DateLikeValueNullable for Option<civil::Date> {}
15impl TimeLikeValueNullable for Option<civil::Time> {}
16impl DateTimeLikeValueNullable for Option<civil::DateTime> {}
17impl DateTimeLikeValueNullable for Option<Timestamp> {}
18
19impl Value {
20    #[inline]
21    pub fn jiff_date<T: Into<Option<civil::Date>>>(v: T) -> Value {
22        Value::JiffDate(v.into())
23    }
24
25    #[inline]
26    pub fn jiff_time<T: Into<Option<civil::Time>>>(v: T) -> Value {
27        Value::JiffTime(v.into())
28    }
29
30    #[inline]
31    pub fn jiff_date_time<T: Into<Option<civil::DateTime>>>(v: T) -> Value {
32        Value::JiffDateTime(v.into().map(Into::into))
33    }
34
35    #[inline]
36    pub fn jiff_timestamp<T: Into<Option<Timestamp>>>(v: T) -> Value {
37        Value::JiffTimestamp(v.into().map(Into::into))
38    }
39}
40
41impl Value {
42    pub fn is_jiff_date(&self) -> bool {
43        matches!(self, Self::JiffDate(_))
44    }
45
46    pub fn is_jiff_time(&self) -> bool {
47        matches!(self, Self::JiffTime(_))
48    }
49
50    pub fn is_jiff_date_time(&self) -> bool {
51        matches!(self, Self::JiffDateTime(_))
52    }
53
54    pub fn is_jiff_timestamp(&self) -> bool {
55        matches!(self, Self::JiffTimestamp(_))
56    }
57
58    pub fn as_ref_jiff_date(&self) -> Option<&civil::Date> {
59        match self {
60            Self::JiffDate(v) => v.as_ref(),
61            _ => panic!("not Value::JiffDate"),
62        }
63    }
64
65    pub fn as_ref_jiff_time(&self) -> Option<&civil::Time> {
66        match self {
67            Self::JiffTime(v) => v.as_ref(),
68            _ => panic!("not Value::JiffTime"),
69        }
70    }
71
72    pub fn as_ref_jiff_date_time(&self) -> Option<&civil::DateTime> {
73        match self {
74            Self::JiffDateTime(v) => v.as_deref(),
75            _ => panic!("not Value::JiffDateTime"),
76        }
77    }
78
79    pub fn as_ref_jiff_timestamp(&self) -> Option<&Timestamp> {
80        match self {
81            Self::JiffTimestamp(v) => v.as_deref(),
82            _ => panic!("not Value::JiffTimestamp"),
83        }
84    }
85}
86
87impl Value {
88    #[cfg(test)]
89    pub(crate) fn jiff_value_to_string(&self) -> Option<String> {
90        match self {
91            Self::JiffDate(v) => v.as_ref().map(|v| v.to_string()),
92            Self::JiffTime(v) => v.as_ref().map(|v| v.to_string()),
93            Self::JiffDateTime(v) => v.as_ref().map(|v| v.to_string()),
94            Self::JiffTimestamp(v) => v.as_ref().map(|v| v.to_string()),
95            _ => panic!("not jiff Value"),
96        }
97    }
98}