summaryrefslogtreecommitdiff
path: root/importers/actualbudget/src/models/budgeting_app/DateTimeUtc.rs
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2024-09-17 13:20:04 +0100
committerJoe Carstairs <me@joeac.net>2024-09-17 13:20:04 +0100
commitcd269b3540fb5e3a988c1b59d3763db360b1fb34 (patch)
treea728403d8d5708ad29eeed2b391706b09a93fe4c /importers/actualbudget/src/models/budgeting_app/DateTimeUtc.rs
parentf0e3e0cfb183253e03b1a61ddecb7b9330d47fdb (diff)
many, many changes
Diffstat (limited to 'importers/actualbudget/src/models/budgeting_app/DateTimeUtc.rs')
-rw-r--r--importers/actualbudget/src/models/budgeting_app/DateTimeUtc.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/importers/actualbudget/src/models/budgeting_app/DateTimeUtc.rs b/importers/actualbudget/src/models/budgeting_app/DateTimeUtc.rs
new file mode 100644
index 0000000..e44fa8c
--- /dev/null
+++ b/importers/actualbudget/src/models/budgeting_app/DateTimeUtc.rs
@@ -0,0 +1,57 @@
+use chrono::{DateTime, Datelike, Utc};
+use diesel::{
+ deserialize::{FromSql, FromSqlRow},
+ expression::AsExpression,
+ serialize::ToSql,
+ sql_types::Text,
+ sqlite::Sqlite,
+};
+use serde::{Deserialize, Serialize};
+
+#[derive(
+ Eq,
+ PartialEq,
+ Ord,
+ PartialOrd,
+ Serialize,
+ Deserialize,
+ Copy,
+ Clone,
+ Debug,
+ AsExpression,
+ FromSqlRow,
+)]
+#[diesel(sql_type=Text)]
+pub struct DateTimeUtc(DateTime<Utc>);
+
+impl DateTimeUtc {
+ pub fn day_diff(&self, other: &DateTimeUtc) -> u32 {
+ self.0
+ .num_days_from_ce()
+ .abs_diff(other.0.num_days_from_ce())
+ }
+
+ pub fn new(date_time_utc: DateTime<Utc>) -> Self {
+ Self(date_time_utc)
+ }
+}
+
+impl ToSql<Text, Sqlite> for DateTimeUtc {
+ fn to_sql<'b>(
+ &'b self,
+ out: &mut diesel::serialize::Output<'b, '_, Sqlite>,
+ ) -> diesel::serialize::Result {
+ out.set_value((*self).0.to_rfc3339());
+ Ok(diesel::serialize::IsNull::No)
+ }
+}
+
+impl FromSql<Text, Sqlite> for DateTimeUtc {
+ fn from_sql(
+ bytes: <Sqlite as diesel::backend::Backend>::RawValue<'_>,
+ ) -> diesel::deserialize::Result<Self> {
+ let str: String = FromSql::<Text, Sqlite>::from_sql(bytes)?;
+ let date_time = str.as_str().parse::<DateTime<Utc>>()?;
+ Ok(DateTimeUtc(date_time))
+ }
+}