From 98db89ce0357b36a4b9a604d7a43953a99e31aeb Mon Sep 17 00:00:00 2001 From: Tobias Reisinger Date: Thu, 2 May 2024 20:12:43 +0200 Subject: [PATCH] Fix is_on function for Periods --- src/db/model_utils.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/db/model_utils.rs b/src/db/model_utils.rs index 4116365..e178d8e 100644 --- a/src/db/model_utils.rs +++ b/src/db/model_utils.rs @@ -1,10 +1,10 @@ use chrono::{NaiveTime, Timelike}; use serde::{Deserialize, Serialize}; +use sqlx::{Decode, Encode, Sqlite, Type}; use sqlx::database::HasArguments; use sqlx::encode::IsNull; use sqlx::error::BoxDynError; use sqlx::sqlite::{SqliteTypeInfo, SqliteValueRef}; -use sqlx::{Decode, Encode, Sqlite, Type}; use crate::db::DbPeriods; @@ -51,13 +51,33 @@ impl Period { } } + pub fn is_always_on(&self) -> bool { + self.start.eq(&self.end) + } + pub fn is_on(&self, now: &NaiveTime) -> bool { - self.start.eq(&self.end) || (self.start.le(now) && self.end.gt(now)) + if self.is_always_on() { + return true; + } + + let start_after_now = self.start.gt(now); + // add check for end time being 00:00 because end being 00:00 would cause end_after_now to always be false + // this will handle end like 24:00 and end_after_now will be true + let end_after_now = self.end.gt(now) || self.end.eq(&NaiveTime::MIN); + let start_before_end = self.start.lt(&self.end); + + match (start_after_now, end_after_now, start_before_end) { + (false, false, true) => false, // both before now; start before end means "normal" period before now + (false, false, false) => true, // both before now; end before start means "inversed" period around now + (true, false, _) => false, // only start after now + (false, true, _) => true, // only end after now + (true, true, true) => false, // both after now but start first + (true, true, false) => true, // both after now but end first + } } pub fn get_next_time(&self, now: &NaiveTime) -> Option { - if self.start.eq(&self.end) { - // this period is always on + if self.is_always_on() { return None; }