fix: Change parsing of task summary for project pane 🐛

This commit is contained in:
Dheepak Krishnamurthy 2021-10-30 17:38:08 -06:00
parent 06eb6c2289
commit 161eb95101

View file

@ -40,12 +40,14 @@ pub struct ProjectsState {
pub rows: Vec<ProjectDetails>, pub rows: Vec<ProjectDetails>,
} }
#[derive(Debug, Clone, Default)]
pub struct ProjectDetails { pub struct ProjectDetails {
name: Project, name: Project,
remaining: usize, remaining: usize,
avg_age: String, avg_age: String,
complete: String, complete: String,
} }
impl ProjectsState { impl ProjectsState {
pub(crate) fn new() -> Self { pub(crate) fn new() -> Self {
Self { Self {
@ -118,42 +120,29 @@ impl ProjectsState {
.context("Unable to run `task summary`") .context("Unable to run `task summary`")
.unwrap(); .unwrap();
let data = String::from_utf8_lossy(&output.stdout); let data = String::from_utf8_lossy(&output.stdout);
let contains_avg_age = data
.split('\n') let lines = data.split('\n').into_iter().skip(1).collect::<Vec<&str>>();
.into_iter()
.skip(1) let header = lines.first().unwrap();
.collect::<Vec<&str>>()
.first() let contains_avg_age = header.contains("Avg age");
.unwrap()
.contains("Avg age"); if contains_avg_age {
for line in data.split('\n').into_iter().skip(3) { let name_index = header.find("Remaining").unwrap();
let remaining_index = header.find("Remaining").unwrap() + "Remaining".len();
let average_age_index = header.find("Avg age").unwrap() + "Avg age".len();
let complete_index = header.find("Complete").unwrap() + "Complete".len();
for line in lines.into_iter().skip(2) {
if line.is_empty() { if line.is_empty() {
break; break;
} }
let mut row: Vec<String> = line
.split(' ') let line = line.to_string();
.map(str::trim) let name = line[0..name_index].trim().to_string();
.map(str::trim_start) let remaining = line[name_index..remaining_index].trim().parse().unwrap();
.filter(|x| !x.is_empty()) let avg_age = line[remaining_index..average_age_index].trim().to_string();
.filter(|x| !x.chars().all(|c| c == '=')) let complete = line[average_age_index..complete_index].trim().to_string();
.map(ToString::to_string)
.collect();
assert!(row.len() >= 3);
let (complete, avg_age, remaining, name) = if contains_avg_age {
(
row.pop().unwrap().parse().unwrap(),
row.pop().unwrap().parse().unwrap(),
row.pop().unwrap().parse().unwrap(),
row.join(" "),
)
} else {
(
row.pop().unwrap().parse().unwrap(),
"0s".to_string(),
row.pop().unwrap().parse().unwrap(),
row.join(" "),
)
};
self.rows.push(ProjectDetails { self.rows.push(ProjectDetails {
name, name,
@ -162,6 +151,8 @@ impl ProjectsState {
complete, complete,
}); });
} }
}
self.list = self.rows.iter().map(|x| x.name.clone()).collect_vec(); self.list = self.rows.iter().map(|x| x.name.clone()).collect_vec();
Ok(()) Ok(())
} }
@ -229,3 +220,18 @@ fn update_task_filter_by_selection(app: &mut TaskwarriorTui) -> Result<()> {
app.update(true)?; app.update(true)?;
Ok(()) Ok(())
} }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_project_summary() {
let mut app = TaskwarriorTui::new("next").unwrap();
app.update(true).unwrap();
dbg!(&app.projects.rows);
dbg!(&app.projects.list);
}
}