fts_demo/
datetime.rs

1use rusqlite::ToSql;
2use rusqlite::types::FromSql;
3use std::borrow::Borrow;
4use time::{OffsetDateTime, PrimitiveDateTime, UtcOffset};
5
6/// This type acts as a bridge between `fts-core`'s use of `OffsetDateTime` and
7/// how SQLite stores timestamps. Whenever we read or store a timestamp, it
8/// should go through this wrapper to ensure consistency.
9pub struct DateTime(PrimitiveDateTime);
10
11impl<T: Borrow<OffsetDateTime>> From<T> for DateTime {
12    fn from(value: T) -> Self {
13        let utc = value.borrow().to_offset(UtcOffset::UTC);
14        Self(PrimitiveDateTime::new(utc.date(), utc.time()))
15    }
16}
17
18impl Into<OffsetDateTime> for DateTime {
19    fn into(self) -> OffsetDateTime {
20        self.0.assume_utc()
21    }
22}
23
24impl ToSql for DateTime {
25    fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> {
26        self.0.to_sql()
27    }
28}
29
30impl FromSql for DateTime {
31    fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult<Self> {
32        PrimitiveDateTime::column_result(value).map(|dt| Self(dt))
33    }
34}