src/tools/systemd/time.rs: add helpers to compute CalendarEvents
This commit is contained in:
		| @ -41,6 +41,73 @@ pub enum DateTimeValue { | ||||
|     Repeated(u32, u32), | ||||
| } | ||||
|  | ||||
| impl DateTimeValue { | ||||
|     // Test if the entry contains the value | ||||
|     pub fn contains(&self, value: u32) -> bool { | ||||
|         match self { | ||||
|             DateTimeValue::Single(v) => *v == value, | ||||
|             DateTimeValue::Range(start, end) => value >= *start && value <= *end, | ||||
|             DateTimeValue::Repeated(start, repetition) => { | ||||
|                 if *repetition > 0 { | ||||
|                     let mut found = false; | ||||
|                     let mut v = *start; | ||||
|                     loop { | ||||
|                         if v == value { found = true; break; } | ||||
|                         v += *repetition; | ||||
|                         if v > value { break; } | ||||
|                     } | ||||
|                     found | ||||
|                 } else { | ||||
|                     *start == value | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Find an return an entry greater than value | ||||
|     pub fn find_next(list: &[DateTimeValue], value: u32) -> Option<u32> { | ||||
|         let mut next: Option<u32> = None; | ||||
|         let mut set_next = |v: u32| { | ||||
|             if let Some(n) = next { | ||||
|                 if v > n { next = Some(v); } | ||||
|             } else { | ||||
|                 next = Some(v); | ||||
|             } | ||||
|         }; | ||||
|         for spec in list { | ||||
|             match spec { | ||||
|                 DateTimeValue::Single(v) => { | ||||
|                     if *v > value { set_next(*v); } | ||||
|                 } | ||||
|                 DateTimeValue::Range(start, end) => { | ||||
|                     if value < *start { | ||||
|                         set_next(*start); | ||||
|                     } else { | ||||
|                         let n = value + 1; | ||||
|                         if n >= *start && n <= *end { | ||||
|                             set_next(n); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 DateTimeValue::Repeated(start, repetition) => { | ||||
|                     if value < *start { | ||||
|                         set_next(*start); | ||||
|                     } else if *repetition > 0 { | ||||
|                         let mut v = *start; | ||||
|                         loop { | ||||
|                             if v > value { set_next(v); break; } | ||||
|                             v += *repetition; | ||||
|                             if v > value { break; } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         next | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Default, Debug)] | ||||
| pub struct CalendarEvent { | ||||
|     pub days: WeekDays, | ||||
|  | ||||
		Reference in New Issue
	
	Block a user