diff options
Diffstat (limited to 'src/renderer.rs')
| -rw-r--r-- | src/renderer.rs | 72 |
1 files changed, 39 insertions, 33 deletions
diff --git a/src/renderer.rs b/src/renderer.rs index ccd083b..53aedec 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -5,7 +5,7 @@ use std::io::{self, Write}; use std::sync::{Arc, Mutex}; pub struct ProgressSimpleRenderer<'a> { - /// Use sub-progress (split by "/", indent by level) + /// Use sub-progress (split by "\/", indent by level) /// If no relevant parent node exists, show parent progress as overall percentage of child progress pub subprogress: bool, @@ -25,6 +25,12 @@ pub struct ProgressSimpleRenderer<'a> { last_line_count: Arc<Mutex<usize>>, } +impl<'a> Default for ProgressSimpleRenderer<'a> { + fn default() -> Self { + Self::new() + } +} + impl<'a> ProgressSimpleRenderer<'a> { /// Create a new renderer pub fn new() -> Self { @@ -151,11 +157,11 @@ impl<'a> ProgressSimpleRenderer<'a> { let mut parent_items: Vec<String> = Vec::new(); for item in items.iter() { - let parts: Vec<&str> = item.name.split('/').collect(); + let parts: Vec<&str> = item.name.split(r"\/").collect(); if parts.len() > 1 { // Build parent node path for i in 1..parts.len() { - let parent_path = parts[0..i].join("/"); + let parent_path = parts[0..i].join(r"\/"); if !parent_items.contains(&parent_path) { parent_items.push(parent_path); } @@ -165,7 +171,7 @@ impl<'a> ProgressSimpleRenderer<'a> { // Compute depth for each item for item in items.iter_mut() { - item.depth = item.name.matches('/').count(); + item.depth = item.name.matches(r"\/").count(); } // Add missing parent nodes @@ -174,7 +180,7 @@ impl<'a> ProgressSimpleRenderer<'a> { // Compute parent node progress let child_progress: Vec<f32> = items .iter() - .filter(|item| item.name.starts_with(&format!("{}/", parent_path))) + .filter(|item| item.name.starts_with(&format!("{}{}", parent_path, r"\/"))) .map(|item| item.progress) .collect(); @@ -198,7 +204,8 @@ impl<'a> ProgressSimpleRenderer<'a> { let item_names: Vec<String> = items.iter().map(|item| item.name.clone()).collect(); for item in items.iter_mut() { if item_names.iter().any(|other_name| { - other_name != &item.name && other_name.starts_with(&format!("{}/", item.name)) + other_name != &item.name + && other_name.starts_with(&format!("{}{}", item.name, r"\/")) }) { item.is_parent = true; } @@ -206,7 +213,7 @@ impl<'a> ProgressSimpleRenderer<'a> { } /// Sort items according to sorting rule - fn sort_items(&self, items: &mut Vec<ProgressItem>) { + fn sort_items(&self, items: &mut [ProgressItem]) { if self.subprogress { items.sort_by(|a, b| match self.sorting { RendererSortingRule::Append => a.name.cmp(&b.name), @@ -239,7 +246,7 @@ impl<'a> ProgressSimpleRenderer<'a> { }; let display_name_len = if self.subprogress { // For sub-progress, only show the last part - item.name.split('/').last().unwrap_or(&item.name).len() + item.name.split(r"\/").last().unwrap_or(&item.name).len() } else { item.name.len() }; @@ -358,7 +365,7 @@ impl<'a> ProgressSimpleRenderer<'a> { // Only show the last part of the path let display_name = if self.subprogress { item.name - .split('/') + .split(r"\/") .last() .unwrap_or(&item.name) .to_string() @@ -550,7 +557,7 @@ mod tests { // Test update and rendering renderer.update( - "task1".to_string(), + r"parent\/task1".to_string(), ProgressState { progress: 0.5, info: ProgressInfo::Info("Processing"), @@ -558,10 +565,10 @@ mod tests { ); renderer.update( - "task2".to_string(), + r"parent\/task2".to_string(), ProgressState { progress: 0.75, - info: ProgressInfo::Warning("Almost done"), + info: ProgressInfo::Info("Processing"), }, ); @@ -574,7 +581,7 @@ mod tests { let renderer = ProgressSimpleRenderer::new().with_subprogress(true); renderer.update( - "download/file1".to_string(), + r"download\/file1".to_string(), ProgressState { progress: 0.5, info: ProgressInfo::Info("Downloading file1"), @@ -582,7 +589,7 @@ mod tests { ); renderer.update( - "download/file2".to_string(), + r"download\/file2".to_string(), ProgressState { progress: 0.75, info: ProgressInfo::Info("Downloading file2"), @@ -654,9 +661,8 @@ mod tests { .with_subprogress(true) .with_theme(theme); - // Add multi-level progress renderer.update( - "parent".to_string(), + r"parent".to_string(), ProgressState { progress: 0.5, info: ProgressInfo::Info("Parent task"), @@ -664,7 +670,7 @@ mod tests { ); renderer.update( - "parent/child".to_string(), + r"parent\/child".to_string(), ProgressState { progress: 0.75, info: ProgressInfo::Info("Child task"), @@ -672,7 +678,7 @@ mod tests { ); renderer.update( - "parent/child/grandchild".to_string(), + r"parent\/child\/grandchild".to_string(), ProgressState { progress: 0.9, info: ProgressInfo::Info("Grandchild task"), @@ -685,9 +691,9 @@ mod tests { // Check internal state { let states = renderer.states.lock().unwrap(); - assert!(states.contains_key("parent")); - assert!(states.contains_key("parent/child")); - assert!(states.contains_key("parent/child/grandchild")); + assert!(states.contains_key(r"parent")); + assert!(states.contains_key(r"parent\/child")); + assert!(states.contains_key(r"parent\/child\/grandchild")); } } @@ -703,18 +709,18 @@ mod tests { // Add test data renderer.update( - "task1".to_string(), + r"parent\/child1".to_string(), ProgressState { progress: 0.5, - info: ProgressInfo::Info("Processing"), + info: ProgressInfo::Info("Processing child1"), }, ); renderer.update( - "task2".to_string(), + r"parent\/child2".to_string(), ProgressState { progress: 0.75, - info: ProgressInfo::Warning("Almost done"), + info: ProgressInfo::Info("Processing child2"), }, ); @@ -724,8 +730,8 @@ mod tests { // Check internal state { let states = renderer.states.lock().unwrap(); - assert!(states.contains_key("task1")); - assert!(states.contains_key("task2")); + assert!(states.contains_key(r"parent\/child1")); + assert!(states.contains_key(r"parent\/child2")); } } @@ -817,7 +823,7 @@ mod tests { // Add parent and child nodes renderer.update( - "progress".to_string(), + r"progress".to_string(), ProgressState { progress: 0.95, info: ProgressInfo::Info("Processing"), @@ -825,7 +831,7 @@ mod tests { ); renderer.update( - "progress/2".to_string(), + r"progress\/2".to_string(), ProgressState { progress: 0.95, info: ProgressInfo::Info("Step 2"), @@ -833,7 +839,7 @@ mod tests { ); renderer.update( - "progress/3".to_string(), + r"progress\/3".to_string(), ProgressState { progress: 0.8, info: ProgressInfo::Info("Step 3"), @@ -846,9 +852,9 @@ mod tests { // Check internal state { let states = renderer.states.lock().unwrap(); - assert!(states.contains_key("progress")); - assert!(states.contains_key("progress/2")); - assert!(states.contains_key("progress/3")); + assert!(states.contains_key(r"progress")); + assert!(states.contains_key(r"progress\/2")); + assert!(states.contains_key(r"progress\/3")); } } } |
