mirror of
https://github.com/kdheepak/taskwarrior-tui.git
synced 2025-08-25 17:57:19 +02:00
fix: Change parsing of task summary for project pane 🐛
This commit is contained in:
parent
06eb6c2289
commit
161eb95101
1 changed files with 48 additions and 42 deletions
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue