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}