aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/archiver.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-21 23:38:32 +0900
committernsfisis <nsfisis@gmail.com>2026-02-21 23:38:32 +0900
commit52310761f67220c9c075cd847205825a720035ee (patch)
tree0528fc94aea7853e41313e19964d74a958dae9c9 /crates/mozart/src/archiver.rs
parent92da9e37c68beb180e45e550fba5acd7d28dca27 (diff)
downloadphp-mozart-52310761f67220c9c075cd847205825a720035ee.tar.gz
php-mozart-52310761f67220c9c075cd847205825a720035ee.tar.zst
php-mozart-52310761f67220c9c075cd847205825a720035ee.zip
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 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src/archiver.rs')
-rw-r--r--crates/mozart/src/archiver.rs56
1 files changed, 48 insertions, 8 deletions
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"));
}