From 2eaccce83c677c117f5e7699d3291dab902a8add Mon Sep 17 00:00:00 2001 From: rendo Date: Tue, 17 Feb 2026 12:28:57 +0500 Subject: [PATCH] Time events --- src/main.rs | 4 +++ src/time_event.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/time_event.rs diff --git a/src/main.rs b/src/main.rs index e7a11a9..dc30fa9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,7 @@ +mod time_event; + fn main() { println!("Hello, world!"); } + +struct ScheduleApp {} diff --git a/src/time_event.rs b/src/time_event.rs new file mode 100644 index 0000000..60e1c31 --- /dev/null +++ b/src/time_event.rs @@ -0,0 +1,73 @@ +use chrono::{DateTime, Datelike, Local, NaiveTime, TimeDelta, WeekdaySet}; + +pub struct TimeEvent { + event_type: TimeEventType, + duration: TimeDelta, +} + +impl TimeEvent { + pub fn oneshot(start: DateTime, duration: f64) -> Self { + Self { + event_type: TimeEventType::Oneshot { start }, + duration: TimeDelta::seconds((duration * 3600.) as i64), + } + } + pub fn periodic(weekdays: WeekdaySet, start_time: NaiveTime, duration: f64) -> Self { + Self { + event_type: TimeEventType::Periodic { + weekdays, + start: start_time, + }, + duration: TimeDelta::seconds((duration * 3600.) as i64), + } + } + pub fn status(&self) -> TimeEventStatus { + let now = Local::now(); + match self.event_type { + TimeEventType::Oneshot { start } => { + let end = start.checked_add_signed(self.duration).unwrap_or(start); + if start < now { + TimeEventStatus::Planned + } else if now > end { + TimeEventStatus::Ended + } else { + TimeEventStatus::Active + } + } + TimeEventType::Periodic { weekdays, start } => { + if weekdays.contains(now.weekday()) { + let start_date = now.with_time(start).unwrap(); + if now < start_date { + TimeEventStatus::Planned + } else if now + > start_date + .checked_add_signed(self.duration) + .unwrap_or(start_date) + { + TimeEventStatus::Ended + } else { + TimeEventStatus::Active + } + } else { + TimeEventStatus::Planned + } + } + } + } +} + +pub enum TimeEventType { + Periodic { + weekdays: WeekdaySet, + start: NaiveTime, + }, + Oneshot { + start: DateTime, + }, +} + +enum TimeEventStatus { + Planned, + Active, + Ended, +}