Skip to main content

sea_orm_spanner/
chrono_support.rs

1use {
2    gcloud_googleapis::spanner::v1::{Type, TypeCode},
3    gcloud_spanner::statement::{single_type, ToKind},
4    prost_types::value::Kind,
5};
6
7pub struct SpannerTimestamp(pub chrono::DateTime<chrono::Utc>);
8
9impl SpannerTimestamp {
10    pub fn new(dt: chrono::DateTime<chrono::Utc>) -> Self {
11        Self(dt)
12    }
13}
14
15impl ToKind for SpannerTimestamp {
16    fn to_kind(&self) -> Kind {
17        Kind::StringValue(self.0.to_rfc3339_opts(chrono::SecondsFormat::Nanos, true))
18    }
19
20    fn get_type() -> Type {
21        single_type(TypeCode::Timestamp)
22    }
23}
24
25pub struct SpannerOptionalTimestamp(pub Option<chrono::DateTime<chrono::Utc>>);
26
27impl SpannerOptionalTimestamp {
28    pub fn some(dt: chrono::DateTime<chrono::Utc>) -> Self {
29        Self(Some(dt))
30    }
31
32    pub fn none() -> Self {
33        Self(None)
34    }
35}
36
37impl ToKind for SpannerOptionalTimestamp {
38    fn to_kind(&self) -> Kind {
39        match &self.0 {
40            Some(dt) => SpannerTimestamp(*dt).to_kind(),
41            None => Kind::NullValue(prost_types::NullValue::NullValue.into()),
42        }
43    }
44
45    fn get_type() -> Type {
46        single_type(TypeCode::Timestamp)
47    }
48}
49
50pub struct SpannerNaiveDateTime(pub chrono::NaiveDateTime);
51
52impl SpannerNaiveDateTime {
53    pub fn new(dt: chrono::NaiveDateTime) -> Self {
54        Self(dt)
55    }
56}
57
58impl ToKind for SpannerNaiveDateTime {
59    fn to_kind(&self) -> Kind {
60        let utc = self.0.and_utc();
61        Kind::StringValue(utc.to_rfc3339_opts(chrono::SecondsFormat::Nanos, true))
62    }
63
64    fn get_type() -> Type {
65        single_type(TypeCode::Timestamp)
66    }
67}
68
69pub struct SpannerOptionalNaiveDateTime(pub Option<chrono::NaiveDateTime>);
70
71impl SpannerOptionalNaiveDateTime {
72    pub fn some(dt: chrono::NaiveDateTime) -> Self {
73        Self(Some(dt))
74    }
75
76    pub fn none() -> Self {
77        Self(None)
78    }
79}
80
81impl ToKind for SpannerOptionalNaiveDateTime {
82    fn to_kind(&self) -> Kind {
83        match &self.0 {
84            Some(dt) => SpannerNaiveDateTime(*dt).to_kind(),
85            None => Kind::NullValue(prost_types::NullValue::NullValue.into()),
86        }
87    }
88
89    fn get_type() -> Type {
90        single_type(TypeCode::Timestamp)
91    }
92}