aboutsummaryrefslogtreecommitdiffstats
path: root/src/task.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/task.rs89
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)
+ }
+}