aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/advisory/auditor.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-07-20 05:21:06 +0900
committernsfisis <nsfisis@gmail.com>2026-07-20 05:21:06 +0900
commit087020525d364e1e5bb3d9b41d020704b068c59c (patch)
tree8f2e94519c6df43afdcd2a53ebe750bb43dc7429 /crates/shirabe/src/advisory/auditor.rs
parentf299bf44f6f19e84110b5fb39c440e2e81ab8310 (diff)
downloadphp-shirabe-087020525d364e1e5bb3d9b41d020704b068c59c.tar.gz
php-shirabe-087020525d364e1e5bb3d9b41d020704b068c59c.tar.zst
php-shirabe-087020525d364e1e5bb3d9b41d020704b068c59c.zip
fix(auditor): restore instanceof ConsoleIO semantics for BufferIO
PHP's BufferIO extends ConsoleIO, so $io instanceof ConsoleIO matches it; the port models that inheritance as composition, making the plain ConsoleIO downcast reject BufferIO and throw where PHP renders tables. Also try a BufferIO downcast and unwrap its inner ConsoleIO, which unblocks the two FORMAT_TABLE cases and un-ignores test_audit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/advisory/auditor.rs')
-rw-r--r--crates/shirabe/src/advisory/auditor.rs18
1 files changed, 16 insertions, 2 deletions
diff --git a/crates/shirabe/src/advisory/auditor.rs b/crates/shirabe/src/advisory/auditor.rs
index 32e34380..ff93268a 100644
--- a/crates/shirabe/src/advisory/auditor.rs
+++ b/crates/shirabe/src/advisory/auditor.rs
@@ -433,7 +433,14 @@ impl Auditor {
match format {
Self::FORMAT_TABLE => {
let io_ref = io.borrow();
- let io_as_console = io_ref.as_any().downcast_ref::<ConsoleIO>();
+ // PHP: `$io instanceof ConsoleIO`. BufferIO extends ConsoleIO in PHP but is
+ // modeled as composition here, so also unwrap it to its inner ConsoleIO.
+ let io_as_console = io_ref.as_any().downcast_ref::<ConsoleIO>().or_else(|| {
+ io_ref
+ .as_any()
+ .downcast_ref::<crate::io::buffer_io::BufferIO>()
+ .map(|buffer_io| &buffer_io.inner)
+ });
if io_as_console.is_none() {
return Err(InvalidArgumentException {
message: format!(
@@ -605,7 +612,14 @@ impl Auditor {
}
let io_ref = io.borrow();
- let io_as_console = io_ref.as_any().downcast_ref::<ConsoleIO>();
+ // PHP: `$io instanceof ConsoleIO`. BufferIO extends ConsoleIO in PHP but is modeled as
+ // composition here, so also unwrap it to its inner ConsoleIO.
+ let io_as_console = io_ref.as_any().downcast_ref::<ConsoleIO>().or_else(|| {
+ io_ref
+ .as_any()
+ .downcast_ref::<crate::io::buffer_io::BufferIO>()
+ .map(|buffer_io| &buffer_io.inner)
+ });
if io_as_console.is_none() {
return Err(InvalidArgumentException {
message: format!(