diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-08-08 22:14:12 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-08-08 22:14:12 +0900 |
| commit | f4cad2123b2af0de72bda4ce039e16e74f163f4e (patch) | |
| tree | 21803308c5ff41e23c9d3b117433eea16b4ff663 /crates/shirabe-external-packages/src/symfony/console/helper | |
| parent | 0209f63210e5b547b5c6b73367bb80ea86c255ec (diff) | |
| download | php-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/helper')
9 files changed, 60 insertions, 121 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/descriptor_helper.rs b/crates/shirabe-external-packages/src/symfony/console/helper/descriptor_helper.rs index 05f0d7d1..36603b06 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/descriptor_helper.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/descriptor_helper.rs @@ -79,13 +79,11 @@ impl DescriptorHelper { }; if !self.descriptors.contains_key(&format) { - return Err( - InvalidArgumentException(shirabe_php_shim::InvalidArgumentException { - message: format!("Unsupported format \"{}\".", format.clone()), - code: 0, - }) - .into(), - ); + return Err(InvalidArgumentException::new(format!( + "Unsupported format \"{}\".", + format.clone() + )) + .into()); } let descriptor = self.descriptors.get_mut(&format).unwrap(); diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/process_helper.rs b/crates/shirabe-external-packages/src/symfony/console/helper/process_helper.rs index 312d8e15..0f81348d 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/process_helper.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/process_helper.rs @@ -103,13 +103,10 @@ impl ProcessHelper { }; } None => { - anyhow::bail!(shirabe_php_shim::InvalidArgumentException { - message: format!( - "Invalid command provided to \"{}()\": the command should be an array whose first element is either the path to the binary to run or a \"Process\" object.", - shirabe_php_shim::PhpMixed::String("ProcessHelper::run".to_string()), - ), - code: 0, - }); + anyhow::bail!(shirabe_php_shim::InvalidArgumentException::new(format!( + "Invalid command provided to \"{}()\": the command should be an array whose first element is either the path to the binary to run or a \"Process\" object.", + shirabe_php_shim::PhpMixed::String("ProcessHelper::run".to_string()), + ))); } } diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/progress_bar.rs b/crates/shirabe-external-packages/src/symfony/console/helper/progress_bar.rs index 0abee1e7..7bfbfbcd 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/progress_bar.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/progress_bar.rs @@ -642,10 +642,7 @@ impl ProgressBar { "remaining".to_string(), Box::new(|bar: &ProgressBar, _output: &std::rc::Rc<std::cell::RefCell<dyn OutputInterface>>| { if bar.get_max_steps() == 0 { - return Ok(Err(LogicException(shirabe_php_shim::LogicException { - message: "Unable to display the remaining time if the maximum number of steps is not set.".to_string(), - code: 0, - }))); + return Ok(Err(LogicException::new("Unable to display the remaining time if the maximum number of steps is not set.".to_string()))); } Ok(Ok(shirabe_php_shim::PhpMixed::String( @@ -658,10 +655,7 @@ impl ProgressBar { "estimated".to_string(), Box::new(|bar: &ProgressBar, _output: &std::rc::Rc<std::cell::RefCell<dyn OutputInterface>>| { if bar.get_max_steps() == 0 { - return Ok(Err(LogicException(shirabe_php_shim::LogicException { - message: "Unable to display the estimated time if the maximum number of steps is not set.".to_string(), - code: 0, - }))); + return Ok(Err(LogicException::new("Unable to display the estimated time if the maximum number of steps is not set.".to_string()))); } Ok(Ok(shirabe_php_shim::PhpMixed::String( @@ -814,10 +808,7 @@ impl ProgressBar { let formatter = formatters.as_ref().unwrap().get(&name).unwrap(); formatter(self, &self.output) }); - match formatter_result? { - Ok(text) => text, - Err(e) => return Err(anyhow::Error::new(e)), - } + formatter_result?? } else if let Some(message) = self.messages.get(&name) { shirabe_php_shim::PhpMixed::String(message.clone()) } else { diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/question_helper.rs b/crates/shirabe-external-packages/src/symfony/console/helper/question_helper.rs index 987c43f1..2091225d 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/question_helper.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/question_helper.rs @@ -185,12 +185,7 @@ pub trait QuestionHelperInterface { } if matches!(read, PhpMixed::Bool(false)) { - return Ok(Err(MissingInputException(RuntimeException( - shirabe_php_shim::RuntimeException { - message: "Aborted.".to_string(), - code: 0, - }, - )))); + return Ok(Err(MissingInputException::new("Aborted.".to_string()))); } r = read; if question.is_trimmable() { @@ -263,17 +258,19 @@ pub trait QuestionHelperInterface { // The validator return type is fixed to InvalidArgumentException here, so the // RuntimeException rethrow branch is statically unreachable; record the error // and retry. - error = Some(shirabe_php_shim::Exception { - message: e.0.message.clone(), - code: e.0.code, - }); + error = Some(shirabe_php_shim::Exception::with_code( + e.get_message().to_string(), + e.get_code(), + )); } } } // throw $error; Err(anyhow::Error::msg( - error.map(|e| e.message).unwrap_or_default(), + error + .map(|e| e.get_message().to_string()) + .unwrap_or_default(), )) } @@ -415,12 +412,12 @@ impl QuestionHelper { let formatter = helper_set.borrow().get_formatter(); formatter.borrow().format_block( - FormatBlockMessages::String(error.message.clone()), + FormatBlockMessages::String(error.get_message().to_string()), "error", false, ) } else { - format!("<error>{}</error>", error.message) + format!("<error>{}</error>", error.get_message()) }; output @@ -491,12 +488,7 @@ impl QuestionHelper { && matches!(question.get_default(), PhpMixed::Null)) { shirabe_php_shim::shell_exec(&format!("stty {}", stty_mode)); - return Err(MissingInputException(RuntimeException( - shirabe_php_shim::RuntimeException { - message: "Aborted.".to_string(), - code: 0, - }, - ))); + return Err(MissingInputException::new("Aborted.".to_string())); } else if c.as_deref() == Some("\u{7f}") { // Backspace Character if 0 == num_matches && 0 != i { @@ -730,10 +722,9 @@ impl QuestionHelper { stty_mode = shirabe_php_shim::shell_exec("stty -g").unwrap_or_default(); shirabe_php_shim::shell_exec("stty -echo"); } else if self.is_interactive_input(input_stream) { - return Ok(Err(RuntimeException(shirabe_php_shim::RuntimeException { - message: "Unable to hide the response.".to_string(), - code: 0, - }))); + return Ok(Err(RuntimeException::new( + "Unable to hide the response.".to_string(), + ))); } let value = shirabe_php_shim::fgets(input_stream, Some(4096)); @@ -745,13 +736,7 @@ impl QuestionHelper { let mut value = match value { Some(value) => value, None => { - return Err(MissingInputException(RuntimeException( - shirabe_php_shim::RuntimeException { - message: "Aborted.".to_string(), - code: 0, - }, - )) - .into()); + return Err(MissingInputException::new("Aborted.".to_string()).into()); } }; if trimmable { diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/symfony_question_helper.rs b/crates/shirabe-external-packages/src/symfony/console/helper/symfony_question_helper.rs index cae3434d..eda54243 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/symfony_question_helper.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/symfony_question_helper.rs @@ -138,7 +138,7 @@ impl QuestionHelperInterface for SymfonyQuestionHelper { let mut borrowed = output.borrow_mut(); if let Some(style) = (*borrowed).as_any_mut().downcast_mut::<SymfonyStyle>() { style.new_line(1); - style.error(PhpMixed::String(error.message.clone())); + style.error(PhpMixed::String(error.get_message().to_string())); return; } diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/table.rs b/crates/shirabe-external-packages/src/symfony/console/helper/table.rs index 66ab3174..a1f5a11e 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/table.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/table.rs @@ -325,12 +325,10 @@ impl Table { return Ok(Ok(style.clone())); } - Ok(Err(InvalidArgumentException( - shirabe_php_shim::InvalidArgumentException { - message: format!("Style \"{}\" is not defined.", name), - code: 0, - }, - ))) + Ok(Err(InvalidArgumentException::new(format!( + "Style \"{}\" is not defined.", + name + )))) } /// Sets table style. @@ -454,14 +452,11 @@ impl Table { /// Adds a row to the table, and re-renders the table. pub fn append_row(&mut self, row: Row) -> anyhow::Result<Result<&mut Self, RuntimeException>> { if !Self::output_is_console_section(&self.output) { - return Ok(Err(RuntimeException(shirabe_php_shim::RuntimeException { - message: format!( - "Output should be an instance of \"{}\" when calling \"{}\".", - "Symfony\\Component\\Console\\Output\\ConsoleSectionOutput", - "Symfony\\Component\\Console\\Helper\\Table::appendRow", - ), - code: 0, - }))); + return Ok(Err(RuntimeException::new(format!( + "Output should be an instance of \"{}\" when calling \"{}\".", + "Symfony\\Component\\Console\\Output\\ConsoleSectionOutput", + "Symfony\\Component\\Console\\Helper\\Table::appendRow", + )))); } if self.rendered { @@ -1373,12 +1368,10 @@ impl Table { return Ok(Ok(style.clone())); } - Ok(Err(InvalidArgumentException( - shirabe_php_shim::InvalidArgumentException { - message: format!("Style \"{}\" is not defined.", name), - code: 0, - }, - ))) + Ok(Err(InvalidArgumentException::new(format!( + "Style \"{}\" is not defined.", + name + )))) } fn formatter_is_wrappable( diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/table_cell.rs b/crates/shirabe-external-packages/src/symfony/console/helper/table_cell.rs index 2b1e592b..c899e5f7 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/table_cell.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/table_cell.rs @@ -35,27 +35,18 @@ impl TableCell { .cloned() .collect(); if !diff.is_empty() { - return Err(InvalidArgumentException( - shirabe_php_shim::InvalidArgumentException { - message: format!( - "The TableCell does not support the following options: '{}'.", - diff.join("', '"), - ), - code: 0, - }, - )); + return Err(InvalidArgumentException::new(format!( + "The TableCell does not support the following options: '{}'.", + diff.join("', '"), + ))); } if let Some(style) = options.get("style") && !matches!(style, TableCellOption::Style(_)) && !matches!(style, TableCellOption::Null) { - return Err(InvalidArgumentException( - shirabe_php_shim::InvalidArgumentException { - message: "The style option must be an instance of \"TableCellStyle\"." - .to_string(), - code: 0, - }, + return Err(InvalidArgumentException::new( + "The style option must be an instance of \"TableCellStyle\".".to_string(), )); } diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/table_cell_style.rs b/crates/shirabe-external-packages/src/symfony/console/helper/table_cell_style.rs index b48b6518..df24b404 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/table_cell_style.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/table_cell_style.rs @@ -52,15 +52,10 @@ impl TableCellStyle { .cloned() .collect(); if !diff.is_empty() { - return Err(InvalidArgumentException( - shirabe_php_shim::InvalidArgumentException { - message: format!( - "The TableCellStyle does not support the following options: '{}'.", - diff.join("', '"), - ), - code: 0, - }, - )); + return Err(InvalidArgumentException::new(format!( + "The TableCellStyle does not support the following options: '{}'.", + diff.join("', '"), + ))); } if let Some(align) = options.get("align") { @@ -69,15 +64,10 @@ impl TableCellStyle { _ => String::new(), }; if align_map(&align).is_none() { - return Err(InvalidArgumentException( - shirabe_php_shim::InvalidArgumentException { - message: format!( - "Wrong align value. Value must be following: '{}'.", - align_map_keys().join("', '"), - ), - code: 0, - }, - )); + return Err(InvalidArgumentException::new(format!( + "Wrong align value. Value must be following: '{}'.", + align_map_keys().join("', '"), + ))); } } diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/table_style.rs b/crates/shirabe-external-packages/src/symfony/console/helper/table_style.rs index a215b989..bbe899af 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/table_style.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/table_style.rs @@ -70,10 +70,9 @@ impl TableStyle { padding_char: String, ) -> anyhow::Result<Result<&mut Self, LogicException>> { if padding_char.is_empty() { - return Ok(Err(LogicException(shirabe_php_shim::LogicException { - message: "The padding char must not be empty.".to_string(), - code: 0, - }))); + return Ok(Err(LogicException::new( + "The padding char must not be empty.".to_string(), + ))); } self.padding_char = padding_char; @@ -254,13 +253,8 @@ impl TableStyle { ] .contains(&pad_type) { - return Ok(Err(InvalidArgumentException( - shirabe_php_shim::InvalidArgumentException { - message: "Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH)." - .to_string(), - code: 0, - }, - ))); + return Ok(Err(InvalidArgumentException::new("Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH)." + .to_string()))); } self.pad_type = pad_type; |
