Skip to main content

mps/elements/
task.rs

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