sea-orm-spanner 0.1.0

Google Cloud Spanner backend for SeaORM
Documentation
use {
    gcloud_googleapis::spanner::v1::{Type, TypeCode},
    gcloud_spanner::statement::{single_type, ToKind},
    prost_types::value::Kind,
};

pub struct SpannerTimestamp(pub chrono::DateTime<chrono::Utc>);

impl SpannerTimestamp {
    pub fn new(dt: chrono::DateTime<chrono::Utc>) -> Self {
        Self(dt)
    }
}

impl ToKind for SpannerTimestamp {
    fn to_kind(&self) -> Kind {
        Kind::StringValue(self.0.to_rfc3339_opts(chrono::SecondsFormat::Nanos, true))
    }

    fn get_type() -> Type {
        single_type(TypeCode::Timestamp)
    }
}

pub struct SpannerOptionalTimestamp(pub Option<chrono::DateTime<chrono::Utc>>);

impl SpannerOptionalTimestamp {
    pub fn some(dt: chrono::DateTime<chrono::Utc>) -> Self {
        Self(Some(dt))
    }

    pub fn none() -> Self {
        Self(None)
    }
}

impl ToKind for SpannerOptionalTimestamp {
    fn to_kind(&self) -> Kind {
        match &self.0 {
            Some(dt) => SpannerTimestamp(*dt).to_kind(),
            None => Kind::NullValue(prost_types::NullValue::NullValue.into()),
        }
    }

    fn get_type() -> Type {
        single_type(TypeCode::Timestamp)
    }
}

pub struct SpannerNaiveDateTime(pub chrono::NaiveDateTime);

impl SpannerNaiveDateTime {
    pub fn new(dt: chrono::NaiveDateTime) -> Self {
        Self(dt)
    }
}

impl ToKind for SpannerNaiveDateTime {
    fn to_kind(&self) -> Kind {
        let utc = self.0.and_utc();
        Kind::StringValue(utc.to_rfc3339_opts(chrono::SecondsFormat::Nanos, true))
    }

    fn get_type() -> Type {
        single_type(TypeCode::Timestamp)
    }
}

pub struct SpannerOptionalNaiveDateTime(pub Option<chrono::NaiveDateTime>);

impl SpannerOptionalNaiveDateTime {
    pub fn some(dt: chrono::NaiveDateTime) -> Self {
        Self(Some(dt))
    }

    pub fn none() -> Self {
        Self(None)
    }
}

impl ToKind for SpannerOptionalNaiveDateTime {
    fn to_kind(&self) -> Kind {
        match &self.0 {
            Some(dt) => SpannerNaiveDateTime(*dt).to_kind(),
            None => Kind::NullValue(prost_types::NullValue::NullValue.into()),
        }
    }

    fn get_type() -> Type {
        single_type(TypeCode::Timestamp)
    }
}