aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-08 22:14:12 +0900
committernsfisis <nsfisis@gmail.com>2026-08-08 22:14:12 +0900
commitf4cad2123b2af0de72bda4ce039e16e74f163f4e (patch)
tree21803308c5ff41e23c9d3b117433eea16b4ff663 /crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs
parent0209f63210e5b547b5c6b73367bb80ea86c255ec (diff)
downloadphp-shirabe-f4cad2123b2af0de72bda4ce039e16e74f163f4e.tar.gz
php-shirabe-f4cad2123b2af0de72bda4ce039e16e74f163f4e.tar.zst
php-shirabe-f4cad2123b2af0de72bda4ce039e16e74f163f4e.zip
feat(php-shim): give ported exceptions PHP's class hierarchy
Ported exceptions were flat structs reached with `downcast_ref`, so Composer's `catch (\RuntimeException $e)` only matched the exact leaf type and `get_class($e)` had nothing to report. Each exception now embeds an instance of the class it extends and travels inside an `AnyThrowable`; `Catch::catch`/`catch_mut` walk that chain, and `PhpClass::php_class_name` yields the PHP FQCN. Dropping the `std::error::Error` impls from the exception types leaves `AnyThrowable` as the only route into an `anyhow::Error`, so the walk cannot be bypassed. A `no_exception_downcast` linter catches the `downcast::<X>()` calls that would now silently answer `None`. Three sites change behavior as a result: the `TransportException` exit-code override reaches `MaxFileSizeExceededException`, the `catch (\LogicException)` in findSimilar() reaches its subclasses, and rendered exception titles carry the real class name rather than a guess. `get_class_err()` is no longer a `todo!()`, which re-enables FilesystemRepositoryTest::testCorruptedRepositoryFile. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs')
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs36
1 files changed, 15 insertions, 21 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs b/crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs
index cc8747ec..5854e248 100644
--- a/crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs
@@ -81,11 +81,9 @@ impl CompleteCommand {
) -> anyhow::Result<CompletionInput> {
let current_index = input.get_option("current")?;
if !current_index.to_bool() || !shirabe_php_shim::ctype_digit(&current_index.to_string()) {
- anyhow::bail!(shirabe_php_shim::RuntimeException {
- message: "The \"--current\" option must be set and it must be an integer."
- .to_string(),
- code: 0,
- });
+ anyhow::bail!(shirabe_php_shim::RuntimeException::new(
+ "The \"--current\" option must be set and it must be an integer.".to_string()
+ ));
}
let tokens: Vec<String> = match input.get_option("input")?.as_list() {
@@ -251,10 +249,9 @@ impl Command for CompleteCommand {
let shell = input.borrow().get_option("shell")?;
if !shell.to_bool() {
- anyhow::bail!(shirabe_php_shim::RuntimeException {
- message: "The \"--shell\" option must be set.".to_string(),
- code: 0,
- });
+ anyhow::bail!(shirabe_php_shim::RuntimeException::new(
+ "The \"--shell\" option must be set.".to_string()
+ ));
}
let completion_output = self
@@ -263,18 +260,15 @@ impl Command for CompleteCommand {
.cloned()
.unwrap_or(PhpMixed::Bool(false));
if !completion_output.to_bool() {
- anyhow::bail!(shirabe_php_shim::RuntimeException {
- message: format!(
- "Shell completion is not supported for your shell: \"{}\" (supported: \"{}\").",
- shell,
- self.completion_outputs
- .keys()
- .cloned()
- .collect::<Vec<_>>()
- .join("\", \"")
- ),
- code: 0,
- });
+ anyhow::bail!(shirabe_php_shim::RuntimeException::new(format!(
+ "Shell completion is not supported for your shell: \"{}\" (supported: \"{}\").",
+ shell,
+ self.completion_outputs
+ .keys()
+ .cloned()
+ .collect::<Vec<_>>()
+ .join("\", \"")
+ )));
}
let mut completion_input = self.create_completion_input(&*input.borrow())?;