Skip to main content

mps/elements/
task.rs

1use super::split_args;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub enum TaskStatus { Open, Done }
5
6#[derive(Debug, Clone)]
7pub struct TaskData {
8    pub tags:   Vec<String>,
9    pub status: TaskStatus,
10}
11
12impl TaskData {
13    pub fn parse_args(raw: &str) -> Self {
14        let p = split_args(raw);
15        let status = match p.attrs.get("status").map(|s| s.as_str()) {
16            Some("done") => TaskStatus::Done,
17            _            => TaskStatus::Open,
18        };
19        TaskData { tags: p.tags, status }
20    }
21
22    pub fn is_done(&self) -> bool { self.status == TaskStatus::Done }
23    pub fn is_open(&self) -> bool { !self.is_done() }
24
25    pub fn status_str(&self) -> &'static str {
26        match self.status { TaskStatus::Done => "done", TaskStatus::Open => "open" }
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn test_default_open() {
36        let d = TaskData::parse_args("work");
37        assert!(d.is_open());
38        assert_eq!(d.tags, vec!["work"]);
39    }
40
41    #[test]
42    fn test_done_status() {
43        let d = TaskData::parse_args("work, status: done");
44        assert!(d.is_done());
45    }
46
47    #[test]
48    fn test_empty_args() {
49        let d = TaskData::parse_args("");
50        assert!(d.is_open());
51        assert!(d.tags.is_empty());
52    }
53}