use super::split_args;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TaskStatus { Open, Done }
#[derive(Debug, Clone)]
pub struct TaskData {
pub tags: Vec<String>,
pub status: TaskStatus,
}
impl TaskData {
pub fn parse_args(raw: &str) -> Self {
let p = split_args(raw);
let status = match p.attrs.get("status").map(|s| s.as_str()) {
Some("done") => TaskStatus::Done,
_ => TaskStatus::Open,
};
TaskData { tags: p.tags, status }
}
pub fn is_done(&self) -> bool { self.status == TaskStatus::Done }
pub fn is_open(&self) -> bool { !self.is_done() }
pub fn status_str(&self) -> &'static str {
match self.status { TaskStatus::Done => "done", TaskStatus::Open => "open" }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_open() {
let d = TaskData::parse_args("work");
assert!(d.is_open());
assert_eq!(d.tags, vec!["work"]);
}
#[test]
fn test_done_status() {
let d = TaskData::parse_args("work, status: done");
assert!(d.is_done());
}
#[test]
fn test_empty_args() {
let d = TaskData::parse_args("");
assert!(d.is_open());
assert!(d.tags.is_empty());
}
}