sea_orm_spanner/
chrono_support.rs1use {
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}