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}