summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-03-23 21:56:40 +0100
committermo8it <mo8it@proton.me>2024-03-23 21:56:40 +0100
commita325df55d1077c8613905bb82709cd8c80341641 (patch)
treec680795db02baa5b8135a75eb81fe3ddb0416cdc /src
parent9c6f56b836e91da9071830d4dd4a64417fdced9d (diff)
Cache filters
Diffstat (limited to 'src')
-rw-r--r--src/main.rs39
1 files changed, 27 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs
index a06f0c5..9bf5866 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -128,31 +128,45 @@ fn main() {
println!("{:<17}\t{:<46}\t{:<7}", "Name", "Path", "Status");
}
let mut exercises_done: u16 = 0;
- let filters = filter.clone().unwrap_or_default().to_lowercase();
- exercises.iter().for_each(|e| {
- let fname = format!("{}", e.path.display());
+ let lowercase_filter = filter
+ .as_ref()
+ .map(|s| s.to_lowercase())
+ .unwrap_or_default();
+ let filters = lowercase_filter
+ .split(',')
+ .filter_map(|f| {
+ let f = f.trim();
+ if f.is_empty() {
+ None
+ } else {
+ Some(f)
+ }
+ })
+ .collect::<Vec<_>>();
+
+ for exercise in &exercises {
+ let fname = format!("{}", exercise.path.display());
let filter_cond = filters
- .split(',')
- .filter(|f| !f.trim().is_empty())
- .any(|f| e.name.contains(f) || fname.contains(f));
- let status = if e.looks_done() {
+ .iter()
+ .any(|f| exercise.name.contains(f) || fname.contains(f));
+ let status = if exercise.looks_done() {
exercises_done += 1;
"Done"
} else {
"Pending"
};
let solve_cond = {
- (e.looks_done() && solved)
- || (!e.looks_done() && unsolved)
+ (exercise.looks_done() && solved)
+ || (!exercise.looks_done() && unsolved)
|| (!solved && !unsolved)
};
if solve_cond && (filter_cond || filter.is_none()) {
let line = if paths {
format!("{fname}\n")
} else if names {
- format!("{}\n", e.name)
+ format!("{}\n", exercise.name)
} else {
- format!("{:<17}\t{fname:<46}\t{status:<7}\n", e.name)
+ format!("{:<17}\t{fname:<46}\t{status:<7}\n", exercise.name)
};
// Somehow using println! leads to the binary panicking
// when its output is piped.
@@ -168,7 +182,8 @@ fn main() {
});
}
}
- });
+ }
+
let percentage_progress = exercises_done as f32 / exercises.len() as f32 * 100.0;
println!(
"Progress: You completed {} / {} exercises ({:.1} %).",