From 52310761f67220c9c075cd847205825a720035ee Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 21 Feb 2026 23:38:32 +0900 Subject: feat(console): add structured error handling, verbosity, and suggestions Implement Phase 7.2 error handling & UX infrastructure: - Add exit_code module with MozartError, bail()/bail_silent() helpers, and Composer-compatible exit code constants (0-5, 100) - Redesign Console struct with Verbosity enum (Quiet/Normal/Verbose/ VeryVerbose/Debug), ANSI auto-detection via IsTerminal, and verbosity-gated output methods (info/verbose/debug/error) - Thread Console through all 33 command execute() signatures - Replace all std::process::exit() calls with structured MozartError returns handled in main() - Migrate eprintln\! status messages to console.info() for quiet-mode suppression - Add suggest module with Levenshtein distance and "Did you mean?" formatting for future package name suggestions Co-Authored-By: Claude Opus 4.6 --- crates/mozart/src/archiver.rs | 56 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 8 deletions(-) (limited to 'crates/mozart/src/archiver.rs') diff --git a/crates/mozart/src/archiver.rs b/crates/mozart/src/archiver.rs index 2deb96f..57985ef 100644 --- a/crates/mozart/src/archiver.rs +++ b/crates/mozart/src/archiver.rs @@ -974,7 +974,12 @@ mod tests { no_ansi: false, }; - execute(&args, &cli).unwrap(); + let console = crate::console::Console { + interactive: false, + verbosity: crate::console::Verbosity::Normal, + decorated: false, + }; + execute(&args, &cli, &console).unwrap(); let archive_path = out.path().join("test-archive.tar"); assert!(archive_path.exists(), "tar archive was not created"); @@ -1038,7 +1043,12 @@ mod tests { no_ansi: false, }; - execute(&args, &cli).unwrap(); + let console = crate::console::Console { + interactive: false, + verbosity: crate::console::Verbosity::Normal, + decorated: false, + }; + execute(&args, &cli, &console).unwrap(); let archive_path = out.path().join("test-archive.zip"); assert!(archive_path.exists(), "zip archive was not created"); @@ -1088,7 +1098,12 @@ mod tests { no_ansi: false, }; - execute(&args, &cli).unwrap(); + let console = crate::console::Console { + interactive: false, + verbosity: crate::console::Verbosity::Normal, + decorated: false, + }; + execute(&args, &cli, &console).unwrap(); assert!(custom_out.path().join("custom.tar").exists()); } @@ -1137,7 +1152,12 @@ mod tests { no_ansi: false, }; - execute(&args, &cli).unwrap(); + let console = crate::console::Console { + interactive: false, + verbosity: crate::console::Verbosity::Normal, + decorated: false, + }; + execute(&args, &cli, &console).unwrap(); assert!(out.path().join("my-custom-name.tar").exists()); } @@ -1190,7 +1210,12 @@ mod tests { no_ansi: false, }; - execute(&args, &cli).unwrap(); + let console = crate::console::Console { + interactive: false, + verbosity: crate::console::Verbosity::Normal, + decorated: false, + }; + execute(&args, &cli, &console).unwrap(); let tar_path = out.path().join("filtered.tar"); assert!(tar_path.exists()); @@ -1255,7 +1280,12 @@ mod tests { no_ansi: false, }; - execute(&args, &cli).unwrap(); + let console = crate::console::Console { + interactive: false, + verbosity: crate::console::Verbosity::Normal, + decorated: false, + }; + execute(&args, &cli, &console).unwrap(); let tar_path = out.path().join("with-excludes.tar"); assert!(tar_path.exists()); @@ -1321,7 +1351,12 @@ mod tests { no_ansi: false, }; - execute(&args, &cli).unwrap(); + let console = crate::console::Console { + interactive: false, + verbosity: crate::console::Verbosity::Normal, + decorated: false, + }; + execute(&args, &cli, &console).unwrap(); let tar_path = out.path().join("unfiltered.tar"); assert!(tar_path.exists()); @@ -1383,7 +1418,12 @@ mod tests { no_ansi: false, }; - let result = execute(&args, &cli); + let console = crate::console::Console { + interactive: false, + verbosity: crate::console::Verbosity::Normal, + decorated: false, + }; + let result = execute(&args, &cli, &console); assert!(result.is_err()); assert!(result.unwrap_err().to_string().contains("rar")); } -- cgit v1.3.1