aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/shirabe-external-packages/src/symfony/component/console/output/console_output.rs17
-rw-r--r--crates/shirabe-external-packages/src/symfony/component/console/output/output_interface.rs7
-rw-r--r--crates/shirabe/src/advisory/auditor.rs6
-rw-r--r--crates/shirabe/src/event_dispatcher/event_dispatcher.rs7
-rw-r--r--crates/shirabe/src/io/buffer_io.rs6
-rw-r--r--crates/shirabe/src/io/console_io.rs18
-rw-r--r--crates/shirabe/src/io/io_interface.rs4
-rw-r--r--crates/shirabe/src/io/null_io.rs6
8 files changed, 48 insertions, 23 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/component/console/output/console_output.rs b/crates/shirabe-external-packages/src/symfony/component/console/output/console_output.rs
index c834394..332cbd1 100644
--- a/crates/shirabe-external-packages/src/symfony/component/console/output/console_output.rs
+++ b/crates/shirabe-external-packages/src/symfony/component/console/output/console_output.rs
@@ -1,4 +1,5 @@
use crate::symfony::component::console::formatter::OutputFormatter;
+use crate::symfony::component::console::output::ConsoleOutputInterface;
use crate::symfony::component::console::output::OutputInterface;
#[derive(Debug)]
@@ -12,13 +13,27 @@ impl ConsoleOutput {
) -> Self {
todo!()
}
+}
+
+impl ConsoleOutputInterface for ConsoleOutput {
+ fn get_error_output(&self) -> &dyn OutputInterface {
+ todo!()
+ }
- pub fn get_error_output(&self) -> &dyn OutputInterface {
+ fn set_error_output(&mut self, _error: Box<dyn OutputInterface>) {
todo!()
}
}
impl OutputInterface for ConsoleOutput {
+ fn is_console_output_interface(&self) -> bool {
+ true
+ }
+
+ fn as_console_output_interface(&self) -> Option<&dyn ConsoleOutputInterface> {
+ Some(self)
+ }
+
fn write(&self, _messages: &str, _newline: bool, _type: i64) {
todo!()
}
diff --git a/crates/shirabe-external-packages/src/symfony/component/console/output/output_interface.rs b/crates/shirabe-external-packages/src/symfony/component/console/output/output_interface.rs
index 36b6c08..11fb82e 100644
--- a/crates/shirabe-external-packages/src/symfony/component/console/output/output_interface.rs
+++ b/crates/shirabe-external-packages/src/symfony/component/console/output/output_interface.rs
@@ -1,4 +1,5 @@
use crate::symfony::component::console::formatter::OutputFormatter;
+use crate::symfony::component::console::output::ConsoleOutputInterface;
pub trait OutputInterface {
// PHP class semantics: OutputInterface methods take &self with interior mutability,
@@ -21,6 +22,12 @@ pub trait OutputInterface {
false
}
+ /// PHP: `$output instanceof ConsoleOutputInterface`. Returns the output as a
+ /// ConsoleOutputInterface trait object when it is one. Default None; ConsoleOutput overrides.
+ fn as_console_output_interface(&self) -> Option<&dyn ConsoleOutputInterface> {
+ None
+ }
+
/// PHP: only StreamOutput exposes `getStream()`. Default panics for outputs without one.
fn get_stream(&self) -> shirabe_php_shim::PhpResource {
todo!("get_stream not available on this OutputInterface implementation")
diff --git a/crates/shirabe/src/advisory/auditor.rs b/crates/shirabe/src/advisory/auditor.rs
index 18af0f3..af54d06 100644
--- a/crates/shirabe/src/advisory/auditor.rs
+++ b/crates/shirabe/src/advisory/auditor.rs
@@ -434,8 +434,7 @@ impl Auditor {
) -> Result<()> {
match format {
Self::FORMAT_TABLE => {
- // TODO(phase-b): `$io instanceof ConsoleIO` downcast from &dyn IOInterface
- let io_as_console: Option<&ConsoleIO> = None;
+ let io_as_console = io.as_any().downcast_ref::<ConsoleIO>();
if io_as_console.is_none() {
return Err(InvalidArgumentException {
message: format!(
@@ -610,8 +609,7 @@ impl Auditor {
return Ok(());
}
- // TODO(phase-b): `$io instanceof ConsoleIO` downcast from &dyn IOInterface
- let io_as_console: Option<&ConsoleIO> = None;
+ let io_as_console = io.as_any().downcast_ref::<ConsoleIO>();
if io_as_console.is_none() {
return Err(InvalidArgumentException {
message: format!(
diff --git a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs
index 237fad4..175b689 100644
--- a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs
+++ b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs
@@ -609,11 +609,8 @@ impl EventDispatcher {
.join(" ");
// reusing the output from $this->io is mostly needed for tests, but generally speaking
// it does not hurt to keep the same stream as the current Application
- // TODO(phase-b): IOInterface needs an `as_any` shim before
- // `instanceof ConsoleIO` can be expressed; treat io as a
- // generic IOInterface for now.
- let downcast: Option<&ConsoleIO> = None;
- let output: ConsoleOutput = if let Some(_console_io) = downcast {
+ let is_console_io = self.io.borrow().as_any().is::<ConsoleIO>();
+ let output: ConsoleOutput = if is_console_io {
// TODO(plugin): \ReflectionProperty to read private `output` from ConsoleIO
// is required by the original PHP — needs user-decided porting strategy.
let _refl_php_version_gate = PHP_VERSION_ID < 80100;
diff --git a/crates/shirabe/src/io/buffer_io.rs b/crates/shirabe/src/io/buffer_io.rs
index ed87b71..291b64b 100644
--- a/crates/shirabe/src/io/buffer_io.rs
+++ b/crates/shirabe/src/io/buffer_io.rs
@@ -245,7 +245,11 @@ impl crate::io::IOInterfaceMutable for BufferIO {
}
}
-impl crate::io::IOInterface for BufferIO {}
+impl crate::io::IOInterface for BufferIO {
+ fn as_any(&self) -> &dyn std::any::Any {
+ self
+ }
+}
impl crate::io::BaseIO for BufferIO {
fn authentications(
diff --git a/crates/shirabe/src/io/console_io.rs b/crates/shirabe/src/io/console_io.rs
index 2b1c334..b69b68b 100644
--- a/crates/shirabe/src/io/console_io.rs
+++ b/crates/shirabe/src/io/console_io.rs
@@ -142,10 +142,7 @@ impl ConsoleIO {
messages
};
- if true == stderr && self.output.is_console_output_interface() {
- // TODO(phase-b): downcast Box<dyn OutputInterface> to ConsoleOutputInterface
- let console_output: &dyn ConsoleOutputInterface =
- todo!("downcast self.output to ConsoleOutputInterface");
+ if stderr && let Some(console_output) = self.output.as_console_output_interface() {
console_output.get_error_output().write(
&Self::to_string_list(&messages).join(if newline { "\n" } else { "" }),
newline,
@@ -263,11 +260,8 @@ impl ConsoleIO {
}
fn get_error_output(&self) -> &dyn OutputInterface {
- if self.output.is_console_output_interface() {
- // TODO(phase-b): downcast Box<dyn OutputInterface> to ConsoleOutputInterface
- return todo!(
- "downcast self.output to ConsoleOutputInterface and call get_error_output()"
- );
+ if let Some(console_output) = self.output.as_console_output_interface() {
+ return console_output.get_error_output();
}
&*self.output
@@ -677,7 +671,11 @@ impl IOInterfaceMutable for ConsoleIO {
}
}
-impl IOInterface for ConsoleIO {}
+impl IOInterface for ConsoleIO {
+ fn as_any(&self) -> &dyn std::any::Any {
+ self
+ }
+}
impl BaseIO for ConsoleIO {
fn authentications(
diff --git a/crates/shirabe/src/io/io_interface.rs b/crates/shirabe/src/io/io_interface.rs
index aac1488..e48f9ce 100644
--- a/crates/shirabe/src/io/io_interface.rs
+++ b/crates/shirabe/src/io/io_interface.rs
@@ -149,7 +149,9 @@ pub trait IOInterfaceMutable {
// PHP `IOInterface`. This is the type used for the shared trait object
// `dyn IOInterface`; its vtable carries both the immutable and mutable methods.
-pub trait IOInterface: IOInterfaceImmutable + IOInterfaceMutable {}
+pub trait IOInterface: IOInterfaceImmutable + IOInterfaceMutable {
+ fn as_any(&self) -> &dyn std::any::Any;
+}
// Shared-ownership handle for a PHP IO instance (reference semantics). It
// exposes only the immutable surface; mutating methods (`set_authentication`,
diff --git a/crates/shirabe/src/io/null_io.rs b/crates/shirabe/src/io/null_io.rs
index b0e11f1..85a5fa5 100644
--- a/crates/shirabe/src/io/null_io.rs
+++ b/crates/shirabe/src/io/null_io.rs
@@ -138,7 +138,11 @@ impl IOInterfaceMutable for NullIO {
}
}
-impl IOInterface for NullIO {}
+impl IOInterface for NullIO {
+ fn as_any(&self) -> &dyn std::any::Any {
+ self
+ }
+}
impl BaseIO for NullIO {
fn authentications(