1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
use std::cmp::Ordering;
use chrono::{NaiveDate, NaiveTime};
pub struct Task {
pub date: NaiveDate,
pub start_time: Option<NaiveTime>,
pub end_time: Option<NaiveTime>,
pub details: String,
pub raw: String,
pub tags: Vec<String>,
}
pub fn cmp_tasks(a: &Task, b: &Task) -> Ordering {
if a.date != b.date {
return if a.date < b.date { Ordering::Less } else { Ordering::Greater };
}
match [a.start_time, b.start_time] {
[None, None] => return Ordering::Equal,
[None, Some(_)] => return Ordering::Greater,
[Some(_), None] => return Ordering::Less,
[Some(atime), Some(btime)] => return if atime < btime { Ordering::Less } else { Ordering::Greater },
}
}
pub fn does_overlap(timespan_start: &NaiveTime, timespan_end: &NaiveTime, task: &Task) -> bool {
return match [task.start_time, task.end_time] {
[Some(start), Some(end)] => (&start <= timespan_start && timespan_start < &end)
|| (&start < timespan_end && timespan_end < &end),
_ => false,
}
}
pub fn tasks_overlap(task_a: &Task, task_b: &Task) -> bool {
return match [task_a.start_time, task_a.end_time] {
[Some(start), Some(end)] => does_overlap(&start, &end, task_b),
_ => false,
}
}
|