Library no longer prints to stderr: - Replace every eprintln! with log::warn! (lib: user_data, http; bin: parsing, output, commands); initialize env_logger in main with a warn-level default so output is unchanged unless RUST_LOG is set - Warn on missing/non-numeric "t" time fields instead of silently coercing them to 0.0; suppress the per-car NotFound warning (most cars legitimately have no timing file), keep warnings for real I/O errors Ownership and clone cleanup: - CarCounts no longer duplicates the car database: drop the car_list field and build car_map by consuming car_list (each Car stored once); iterate car_map.values() where the list was previously used - run_analysis takes MyCarsData by value: owned moves into the parse Arc, owned_configs/copy_count move into CarCounts; only the three commands that need owned/wishlist afterwards retain their own copy - is_final_build checks the digits directly (no per-call String allocation) and treats malformed configs as non-final so they surface in improve.csv; owned_final_configs becomes a borrowed rid-to-configs map so the target-exclusion check allocates nothing - Normalize sum arithmetic to u8 in normalize_to_final_build Docs and structure: - Document the first-seen-wins tie-breaking in compute_ideal_wishlist and the non-final/non-best coverage gap in write_trash_csv - Extract compare_by_rq_config_brand_name shared by compare_records and the remove.csv sort; drop the unused _output_dir parameter from run_track; add a retry_delay helper de-duplicating the three HTTP backoff sites; rename the shadowed `entry` binding to config_data
27 lines
903 B
Rust
27 lines
903 B
Rust
//! Improve command implementation.
|
|
//!
|
|
//! Generates improve.csv — owned cars not yet in a final configuration,
|
|
//! sorted by number of best tracks (descending).
|
|
|
|
use top_drives::AppError;
|
|
|
|
use crate::commands::{load_my_cars_or_warn, run_analysis};
|
|
use crate::output::write_improve_csv;
|
|
|
|
/// Executes the improve command: generates improve.csv.
|
|
pub async fn run_improve(
|
|
my_cars_path: &str,
|
|
cars_db_path: &str,
|
|
times_dir: &str,
|
|
output_dir: &str,
|
|
) -> Result<(), AppError> {
|
|
let my_data = load_my_cars_or_warn(my_cars_path)?;
|
|
let (_ctx, counts) = run_analysis(my_data, cars_db_path, times_dir).await?;
|
|
let count = write_improve_csv(output_dir, &counts)?;
|
|
if count == 0 {
|
|
println!("No cars to improve — all owned cars are already in final or maxed configs.");
|
|
} else {
|
|
println!("Written: improve.csv ({count} cars to improve)");
|
|
}
|
|
Ok(())
|
|
}
|