From 2d78f842525bcaa90226e631b997b6ed33358729 Mon Sep 17 00:00:00 2001 From: kuuuube Date: Mon, 11 May 2026 19:52:16 -0400 Subject: [PATCH 1/4] Add dumpall internals and make dump filtering more generic --- src/cleanup_modules/device_cleanup.rs | 60 +++++++++++-------- src/cleanup_modules/driver_cleanup.rs | 56 +++++++++-------- src/cleanup_modules/driver_package_cleanup.rs | 58 ++++++++++-------- src/cleanup_modules/mod.rs | 1 + 4 files changed, 100 insertions(+), 75 deletions(-) diff --git a/src/cleanup_modules/device_cleanup.rs b/src/cleanup_modules/device_cleanup.rs index 62d3672..11eaa92 100644 --- a/src/cleanup_modules/device_cleanup.rs +++ b/src/cleanup_modules/device_cleanup.rs @@ -148,36 +148,44 @@ struct DeviceDumper {} #[async_trait] impl Dumper for DeviceDumper { async fn dump(&self, state: &State) -> Result<(), ModuleError> { - let inf_regex = Regex::new(r"^oem[0-9]+\.inf$").unwrap(); - let devices: Vec = enumerate_devices() - .into_module_report(DEVICE_MODULE_NAME)? - .into_iter() - .filter(|d| inf_regex.is_match(d.inf_name().unwrap_or(""))) - .filter(is_of_interest) - .collect(); - - let file_path = - get_path_to_dump(state, "devices.json").into_module_report(DEVICE_MODULE_NAME)?; - let dump_file = create_dump_file(&file_path).into_module_report(DEVICE_MODULE_NAME)?; - let file_name = file_path.as_path().to_str().unwrap(); - - if devices.is_empty() { - println!("No devices to dump"); - return Ok(()); - } + dump_filtered(state, is_of_interest).await + } - serde_json::to_writer_pretty(dump_file, &devices) - .into_report() - .attach_printable_lazy(|| format!("failed to dump devices into '{}'", file_name)) - .into_module_report(DEVICE_MODULE_NAME)?; + async fn dumpall(&self, state: &State) -> Result<(), ModuleError> { + dump_filtered(state, |_| true).await + } +} - match devices.len() { - 1 => println!("Dumped 1 device to {}", file_name), - n => println!("Dumped {} devices to {}", n, file_name), - } +async fn dump_filtered bool>(state: &State, filter_fn: F) -> Result<(), ModuleError> { + let inf_regex = Regex::new(r"^oem[0-9]+\.inf$").unwrap(); + let devices: Vec = enumerate_devices() + .into_module_report(DEVICE_MODULE_NAME)? + .into_iter() + .filter(|d| inf_regex.is_match(d.inf_name().unwrap_or(""))) + .filter(filter_fn) + .collect(); + + let file_path = + get_path_to_dump(state, "devices.json").into_module_report(DEVICE_MODULE_NAME)?; + let dump_file = create_dump_file(&file_path).into_module_report(DEVICE_MODULE_NAME)?; + let file_name = file_path.as_path().to_str().unwrap(); + + if devices.is_empty() { + println!("No devices to dump"); + return Ok(()); + } - Ok(()) + serde_json::to_writer_pretty(dump_file, &devices) + .into_report() + .attach_printable_lazy(|| format!("failed to dump devices into '{}'", file_name)) + .into_module_report(DEVICE_MODULE_NAME)?; + + match devices.len() { + 1 => println!("Dumped 1 device to {}", file_name), + n => println!("Dumped {} devices to {}", n, file_name), } + + Ok(()) } #[derive(Deserialize, Debug)] diff --git a/src/cleanup_modules/driver_cleanup.rs b/src/cleanup_modules/driver_cleanup.rs index fb0d58c..3ebe3a0 100644 --- a/src/cleanup_modules/driver_cleanup.rs +++ b/src/cleanup_modules/driver_cleanup.rs @@ -124,34 +124,42 @@ struct DriverDumper {} #[async_trait] impl Dumper for DriverDumper { async fn dump(&self, state: &State) -> Result<(), ModuleError> { - let drivers: Vec = enumerate_drivers() - .into_module_report(DRIVER_MODULE_NAME)? - .into_iter() - .filter(is_of_interest) - .collect(); - - let file_path = - get_path_to_dump(state, "drivers.json").into_module_report(DRIVER_MODULE_NAME)?; - let dump_file = create_dump_file(&file_path).into_module_report(DRIVER_MODULE_NAME)?; - let file_name = file_path.as_path().to_str().unwrap(); - - if drivers.is_empty() { - println!("No drivers to dump"); - return Ok(()); - } + dump_filtered(state, is_of_interest).await + } - serde_json::to_writer_pretty(dump_file, &drivers) - .into_report() - .attach_printable_lazy(|| format!("failed to dump drivers into '{}'", file_name)) - .into_module_report(DRIVER_MODULE_NAME)?; + async fn dumpall(&self, state: &State) -> Result<(), ModuleError> { + dump_filtered(state, |_| true).await + } +} - match drivers.len() { - 1 => println!("Dumped 1 driver into '{}'", file_name), - n => println!("Dumped {} drivers into '{}'", n, file_name), - } +async fn dump_filtered bool>(state: &State, filter_fn: F) -> Result<(), ModuleError> { + let drivers: Vec = enumerate_drivers() + .into_module_report(DRIVER_MODULE_NAME)? + .into_iter() + .filter(filter_fn) + .collect(); + + let file_path = + get_path_to_dump(state, "drivers.json").into_module_report(DRIVER_MODULE_NAME)?; + let dump_file = create_dump_file(&file_path).into_module_report(DRIVER_MODULE_NAME)?; + let file_name = file_path.as_path().to_str().unwrap(); + + if drivers.is_empty() { + println!("No drivers to dump"); + return Ok(()); + } - Ok(()) + serde_json::to_writer_pretty(dump_file, &drivers) + .into_report() + .attach_printable_lazy(|| format!("failed to dump drivers into '{}'", file_name)) + .into_module_report(DRIVER_MODULE_NAME)?; + + match drivers.len() { + 1 => println!("Dumped 1 driver into '{}'", file_name), + n => println!("Dumped {} drivers into '{}'", n, file_name), } + + Ok(()) } #[derive(Deserialize, Debug)] diff --git a/src/cleanup_modules/driver_package_cleanup.rs b/src/cleanup_modules/driver_package_cleanup.rs index ebb2d62..dc391a8 100644 --- a/src/cleanup_modules/driver_package_cleanup.rs +++ b/src/cleanup_modules/driver_package_cleanup.rs @@ -150,36 +150,44 @@ struct DriverPackageDumper {} #[async_trait] impl Dumper for DriverPackageDumper { async fn dump(&self, state: &State) -> Result<(), ModuleError> { - let driver_packages: Vec = enumerate_driver_packages() - .into_module_report(MODULE_NAME)? - .into_iter() - .filter(is_of_interest) - .collect(); - - let file_path = - get_path_to_dump(state, "driver-packages.json").into_module_report(MODULE_NAME)?; - let dump_file = create_dump_file(&file_path).into_module_report(MODULE_NAME)?; - let file_name = file_path.as_path().to_str().unwrap(); + dump_filtered(state, is_of_interest).await + } - if driver_packages.is_empty() { - println!("No driver packages to dump"); - return Ok(()); - } + async fn dumpall(&self, state: &State) -> Result<(), ModuleError> { + dump_filtered(state, |_| true).await + } +} - serde_json::to_writer_pretty(dump_file, &driver_packages) - .into_report() - .attach_printable_lazy(|| { - format!("failed to dump driver packages into '{}'", file_name) - }) - .into_module_report(MODULE_NAME)?; +async fn dump_filtered bool>(state: &State, filter_fn: F) -> Result<(), ModuleError> { + let driver_packages: Vec = enumerate_driver_packages() + .into_module_report(MODULE_NAME)? + .into_iter() + .filter(filter_fn) + .collect(); + + let file_path = + get_path_to_dump(state, "driver-packages.json").into_module_report(MODULE_NAME)?; + let dump_file = create_dump_file(&file_path).into_module_report(MODULE_NAME)?; + let file_name = file_path.as_path().to_str().unwrap(); + + if driver_packages.is_empty() { + println!("No driver packages to dump"); + return Ok(()); + } - match driver_packages.len() { - 1 => println!("Dumped 1 driver package into '{}'", file_name), - n => println!("Dumped {} driver packages into '{}'", n, file_name), - } + serde_json::to_writer_pretty(dump_file, &driver_packages) + .into_report() + .attach_printable_lazy(|| { + format!("failed to dump driver packages into '{}'", file_name) + }) + .into_module_report(MODULE_NAME)?; - Ok(()) + match driver_packages.len() { + 1 => println!("Dumped 1 driver package into '{}'", file_name), + n => println!("Dumped {} driver packages into '{}'", n, file_name), } + + Ok(()) } #[derive(Deserialize, Debug)] diff --git a/src/cleanup_modules/mod.rs b/src/cleanup_modules/mod.rs index 7e2d8a7..2f43758 100644 --- a/src/cleanup_modules/mod.rs +++ b/src/cleanup_modules/mod.rs @@ -178,6 +178,7 @@ pub struct ModuleRunInfo { #[async_trait] pub trait Dumper { async fn dump(&self, state: &State) -> Result<(), ModuleError>; + async fn dumpall(&self, state: &State) -> Result<(), ModuleError>; } fn get_path_to_dump(state: &State, filename: &str) -> Result { From e6e91e21887fb9d026bed6303b8b074f37f1e97e Mon Sep 17 00:00:00 2001 From: kuuuube Date: Mon, 11 May 2026 19:59:34 -0400 Subject: [PATCH 2/4] Add output_file to dump_filtered --- src/cleanup_modules/device_cleanup.rs | 8 ++++---- src/cleanup_modules/driver_cleanup.rs | 8 ++++---- src/cleanup_modules/driver_package_cleanup.rs | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/cleanup_modules/device_cleanup.rs b/src/cleanup_modules/device_cleanup.rs index 11eaa92..168ed35 100644 --- a/src/cleanup_modules/device_cleanup.rs +++ b/src/cleanup_modules/device_cleanup.rs @@ -148,15 +148,15 @@ struct DeviceDumper {} #[async_trait] impl Dumper for DeviceDumper { async fn dump(&self, state: &State) -> Result<(), ModuleError> { - dump_filtered(state, is_of_interest).await + dump_filtered(state, "devices.json", is_of_interest).await } async fn dumpall(&self, state: &State) -> Result<(), ModuleError> { - dump_filtered(state, |_| true).await + dump_filtered(state, "devices-all.json", |_| true).await } } -async fn dump_filtered bool>(state: &State, filter_fn: F) -> Result<(), ModuleError> { +async fn dump_filtered bool>(state: &State, output_file: &str, filter_fn: F) -> Result<(), ModuleError> { let inf_regex = Regex::new(r"^oem[0-9]+\.inf$").unwrap(); let devices: Vec = enumerate_devices() .into_module_report(DEVICE_MODULE_NAME)? @@ -166,7 +166,7 @@ async fn dump_filtered bool>(state: &State, filter_fn: F) -> R .collect(); let file_path = - get_path_to_dump(state, "devices.json").into_module_report(DEVICE_MODULE_NAME)?; + get_path_to_dump(state, output_file).into_module_report(DEVICE_MODULE_NAME)?; let dump_file = create_dump_file(&file_path).into_module_report(DEVICE_MODULE_NAME)?; let file_name = file_path.as_path().to_str().unwrap(); diff --git a/src/cleanup_modules/driver_cleanup.rs b/src/cleanup_modules/driver_cleanup.rs index 3ebe3a0..1bbca37 100644 --- a/src/cleanup_modules/driver_cleanup.rs +++ b/src/cleanup_modules/driver_cleanup.rs @@ -124,15 +124,15 @@ struct DriverDumper {} #[async_trait] impl Dumper for DriverDumper { async fn dump(&self, state: &State) -> Result<(), ModuleError> { - dump_filtered(state, is_of_interest).await + dump_filtered(state, "drivers.json", is_of_interest).await } async fn dumpall(&self, state: &State) -> Result<(), ModuleError> { - dump_filtered(state, |_| true).await + dump_filtered(state, "drivers-all.json", |_| true).await } } -async fn dump_filtered bool>(state: &State, filter_fn: F) -> Result<(), ModuleError> { +async fn dump_filtered bool>(state: &State, output_file: &str, filter_fn: F) -> Result<(), ModuleError> { let drivers: Vec = enumerate_drivers() .into_module_report(DRIVER_MODULE_NAME)? .into_iter() @@ -140,7 +140,7 @@ async fn dump_filtered bool>(state: &State, filter_fn: F) -> R .collect(); let file_path = - get_path_to_dump(state, "drivers.json").into_module_report(DRIVER_MODULE_NAME)?; + get_path_to_dump(state, output_file).into_module_report(DRIVER_MODULE_NAME)?; let dump_file = create_dump_file(&file_path).into_module_report(DRIVER_MODULE_NAME)?; let file_name = file_path.as_path().to_str().unwrap(); diff --git a/src/cleanup_modules/driver_package_cleanup.rs b/src/cleanup_modules/driver_package_cleanup.rs index dc391a8..a32d4e9 100644 --- a/src/cleanup_modules/driver_package_cleanup.rs +++ b/src/cleanup_modules/driver_package_cleanup.rs @@ -150,15 +150,15 @@ struct DriverPackageDumper {} #[async_trait] impl Dumper for DriverPackageDumper { async fn dump(&self, state: &State) -> Result<(), ModuleError> { - dump_filtered(state, is_of_interest).await + dump_filtered(state, "driver-packages.json", is_of_interest).await } async fn dumpall(&self, state: &State) -> Result<(), ModuleError> { - dump_filtered(state, |_| true).await + dump_filtered(state, "driver-packages-all.json", |_| true).await } } -async fn dump_filtered bool>(state: &State, filter_fn: F) -> Result<(), ModuleError> { +async fn dump_filtered bool>(state: &State, output_file: &str, filter_fn: F) -> Result<(), ModuleError> { let driver_packages: Vec = enumerate_driver_packages() .into_module_report(MODULE_NAME)? .into_iter() @@ -166,7 +166,7 @@ async fn dump_filtered bool>(state: &State, filter_fn: .collect(); let file_path = - get_path_to_dump(state, "driver-packages.json").into_module_report(MODULE_NAME)?; + get_path_to_dump(state, output_file).into_module_report(MODULE_NAME)?; let dump_file = create_dump_file(&file_path).into_module_report(MODULE_NAME)?; let file_name = file_path.as_path().to_str().unwrap(); From 6b33aac952d988edd2930660601097de9c4546e0 Mon Sep 17 00:00:00 2001 From: kuuuube Date: Mon, 11 May 2026 20:08:57 -0400 Subject: [PATCH 3/4] dump and dumpall on dump --- src/lib.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a3a9e9c..0b5f0b8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -181,11 +181,13 @@ pub async fn dump(config: Config) { None => continue, }; - let result = dumper.dump(&state).await; - if let Err(err) = result { - eprintln!("{:?}", err); - eprintln!() - } + let results = [dumper.dump(&state).await, dumper.dumpall(&state).await]; + results.iter().for_each(|result| { + if let Err(err) = result { + eprintln!("{:?}", err); + eprintln!() + } + }); } } From bd8e9c6bdec7840dffd35fdd6d7d973ec1af839d Mon Sep 17 00:00:00 2001 From: kuuuube Date: Mon, 11 May 2026 20:10:30 -0400 Subject: [PATCH 4/4] Cargo fmt --- src/cleanup_modules/device_cleanup.rs | 9 ++++++--- src/cleanup_modules/driver_cleanup.rs | 9 ++++++--- src/cleanup_modules/driver_package_cleanup.rs | 13 +++++++------ src/services/regex_cache.rs | 4 +++- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/cleanup_modules/device_cleanup.rs b/src/cleanup_modules/device_cleanup.rs index 168ed35..2cea49e 100644 --- a/src/cleanup_modules/device_cleanup.rs +++ b/src/cleanup_modules/device_cleanup.rs @@ -156,7 +156,11 @@ impl Dumper for DeviceDumper { } } -async fn dump_filtered bool>(state: &State, output_file: &str, filter_fn: F) -> Result<(), ModuleError> { +async fn dump_filtered bool>( + state: &State, + output_file: &str, + filter_fn: F, +) -> Result<(), ModuleError> { let inf_regex = Regex::new(r"^oem[0-9]+\.inf$").unwrap(); let devices: Vec = enumerate_devices() .into_module_report(DEVICE_MODULE_NAME)? @@ -165,8 +169,7 @@ async fn dump_filtered bool>(state: &State, output_file: &str, .filter(filter_fn) .collect(); - let file_path = - get_path_to_dump(state, output_file).into_module_report(DEVICE_MODULE_NAME)?; + let file_path = get_path_to_dump(state, output_file).into_module_report(DEVICE_MODULE_NAME)?; let dump_file = create_dump_file(&file_path).into_module_report(DEVICE_MODULE_NAME)?; let file_name = file_path.as_path().to_str().unwrap(); diff --git a/src/cleanup_modules/driver_cleanup.rs b/src/cleanup_modules/driver_cleanup.rs index 1bbca37..5bc790c 100644 --- a/src/cleanup_modules/driver_cleanup.rs +++ b/src/cleanup_modules/driver_cleanup.rs @@ -132,15 +132,18 @@ impl Dumper for DriverDumper { } } -async fn dump_filtered bool>(state: &State, output_file: &str, filter_fn: F) -> Result<(), ModuleError> { +async fn dump_filtered bool>( + state: &State, + output_file: &str, + filter_fn: F, +) -> Result<(), ModuleError> { let drivers: Vec = enumerate_drivers() .into_module_report(DRIVER_MODULE_NAME)? .into_iter() .filter(filter_fn) .collect(); - let file_path = - get_path_to_dump(state, output_file).into_module_report(DRIVER_MODULE_NAME)?; + let file_path = get_path_to_dump(state, output_file).into_module_report(DRIVER_MODULE_NAME)?; let dump_file = create_dump_file(&file_path).into_module_report(DRIVER_MODULE_NAME)?; let file_name = file_path.as_path().to_str().unwrap(); diff --git a/src/cleanup_modules/driver_package_cleanup.rs b/src/cleanup_modules/driver_package_cleanup.rs index a32d4e9..2cd4736 100644 --- a/src/cleanup_modules/driver_package_cleanup.rs +++ b/src/cleanup_modules/driver_package_cleanup.rs @@ -158,15 +158,18 @@ impl Dumper for DriverPackageDumper { } } -async fn dump_filtered bool>(state: &State, output_file: &str, filter_fn: F) -> Result<(), ModuleError> { +async fn dump_filtered bool>( + state: &State, + output_file: &str, + filter_fn: F, +) -> Result<(), ModuleError> { let driver_packages: Vec = enumerate_driver_packages() .into_module_report(MODULE_NAME)? .into_iter() .filter(filter_fn) .collect(); - let file_path = - get_path_to_dump(state, output_file).into_module_report(MODULE_NAME)?; + let file_path = get_path_to_dump(state, output_file).into_module_report(MODULE_NAME)?; let dump_file = create_dump_file(&file_path).into_module_report(MODULE_NAME)?; let file_name = file_path.as_path().to_str().unwrap(); @@ -177,9 +180,7 @@ async fn dump_filtered bool>(state: &State, output_file serde_json::to_writer_pretty(dump_file, &driver_packages) .into_report() - .attach_printable_lazy(|| { - format!("failed to dump driver packages into '{}'", file_name) - }) + .attach_printable_lazy(|| format!("failed to dump driver packages into '{}'", file_name)) .into_module_report(MODULE_NAME)?; match driver_packages.len() { diff --git a/src/services/regex_cache.rs b/src/services/regex_cache.rs index 1505642..a68fe24 100644 --- a/src/services/regex_cache.rs +++ b/src/services/regex_cache.rs @@ -26,7 +26,9 @@ pub fn cached_match(input: Option<&str>, regex_pattern: Option<&str>) -> bool { Some(regex) => regex, None => { let regex = build_regex(regex_pattern); - let Entry::Vacant(vacant) = cache.entry(regex_pattern.to_string()) else { unreachable!() }; + let Entry::Vacant(vacant) = cache.entry(regex_pattern.to_string()) else { + unreachable!() + }; vacant.insert(regex) } }