summaryrefslogtreecommitdiff
path: root/src/task.rs
blob: 817628df72de6787a588e5e43e0a7be59c2af035 (plain)
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,
    }
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback