diff options
Diffstat (limited to '')
-rw-r--r-- | src/task.rs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/task.rs b/src/task.rs new file mode 100644 index 0000000..dcfe776 --- /dev/null +++ b/src/task.rs @@ -0,0 +1,89 @@ +use std::{ + borrow::{Borrow, Cow}, + str::FromStr, +}; + +use chrono::{NaiveDateTime, TimeDelta}; +use sqlx::{ + encode::IsNull, + sqlite::{SqliteArgumentValue, SqliteTypeInfo, SqliteValue}, + Decode, Sqlite, Type, TypeInfo, Value, ValueRef, +}; + +pub struct Task { + pub name: String, + pub cron: Option<Schedule>, + pub archived: bool, + pub description: Option<String>, +} + +impl Task { + pub fn new( + name: String, + cron: Option<Schedule>, + archived: bool, + description: Option<String>, + ) -> Self { + Self { + name, + cron, + archived, + description, + } + } +} + +pub struct Schedule(cron::Schedule); + +impl sqlx::Encode<'_, Sqlite> for Schedule { + fn encode_by_ref( + &self, + buf: &mut <Sqlite as sqlx::Database>::ArgumentBuffer<'_>, + ) -> Result<sqlx::encode::IsNull, sqlx::error::BoxDynError> { + let schedule = &self.0; + let schedule = schedule.to_string(); + buf.push(SqliteArgumentValue::Text(Cow::Owned(schedule))); + + Ok(IsNull::No) + } +} + +impl sqlx::Decode<'_, Sqlite> for Schedule { + fn decode( + value: <Sqlite as sqlx::Database>::ValueRef<'_>, + ) -> Result<Self, sqlx::error::BoxDynError> { + let schedule = Decode::<Sqlite>::decode(value)?; + let schedule = cron::Schedule::from_str(schedule)?; + Ok(Self(schedule)) + } +} + +impl Type<Sqlite> for Schedule { + fn type_info() -> <Sqlite as sqlx::Database>::TypeInfo { + <&str as Type<Sqlite>>::type_info() + } +} + +pub struct Category(String); + +impl Category { + pub fn new(category: String) -> Self { + Self(category) + } +} + +pub struct Log(NaiveDateTime); + +impl Log { + pub fn new(datetime: NaiveDateTime) -> Self { + Self(datetime) + } +} + +pub struct Reminder(TimeDelta); + +impl Reminder { + pub fn new(time_delta: TimeDelta) -> Self { + Self(time_delta) + } +} |