aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-external-packages/src/symfony/console/command
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
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')
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/command/command.rs23
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs36
2 files changed, 24 insertions, 35 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console/command/command.rs b/crates/shirabe-external-packages/src/symfony/console/command/command.rs
index ca61717d..a1636848 100644
--- a/crates/shirabe-external-packages/src/symfony/console/command/command.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/command/command.rs
@@ -138,12 +138,10 @@ impl CommandData {
let mut matches: Vec<Option<String>> = Vec::new();
if !shirabe_php_shim::preg_match(php_regex!(r"/^[^\:]++(\:[^\:]++)*$/"), name, &mut matches)
{
- return Ok(Err(InvalidArgumentException(
- shirabe_php_shim::InvalidArgumentException {
- message: format!("Command name \"{}\" is invalid.", name),
- code: 0,
- },
- )));
+ return Ok(Err(InvalidArgumentException::new(format!(
+ "Command name \"{}\" is invalid.",
+ name
+ ))));
}
Ok(Ok(()))
@@ -847,14 +845,11 @@ impl Command for CommandData {
let helper_set = match &*helper_set_ref {
None => {
return Ok(Err(
- crate::symfony::console::exception::logic_exception::LogicException(
- shirabe_php_shim::LogicException {
- message: format!(
- "Cannot retrieve helper \"{}\" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.",
- name
- ),
- code: 0,
- },
+ crate::symfony::console::exception::logic_exception::LogicException::new(
+ format!(
+ "Cannot retrieve helper \"{}\" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.",
+ name
+ ),
),
));
}
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())?;