summaryrefslogtreecommitdiff
path: root/src/renderer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer.rs')
-rw-r--r--src/renderer.rs72
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"));
}
}
}