From 0ccb1a7740e63e4118c156f81aacf6381ae38464 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 24 Jun 2026 00:50:07 +0900 Subject: feat(io): implement BufferIO new/get_output/set_user_inputs Wire StreamOutput into BufferIO::new, retrieve the stream in get_output via downcast, and set the user input stream in set_user_inputs. Add as_streamable_mut to InputInterface (and ArgvInput) for mutable streamable access, and make StringInput implement StreamableInputInterface to match PHP, where StringInput is streamable via its Input ancestor. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/symfony/console/input/argv_input.rs | 4 ++++ .../src/symfony/console/input/input_interface.rs | 5 +++++ .../src/symfony/console/input/string_input.rs | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+) (limited to 'crates/shirabe-external-packages') diff --git a/crates/shirabe-external-packages/src/symfony/console/input/argv_input.rs b/crates/shirabe-external-packages/src/symfony/console/input/argv_input.rs index 0784c7b..875d217 100644 --- a/crates/shirabe-external-packages/src/symfony/console/input/argv_input.rs +++ b/crates/shirabe-external-packages/src/symfony/console/input/argv_input.rs @@ -623,6 +623,10 @@ impl InputInterface for ArgvInput { fn as_streamable(&self) -> Option<&dyn StreamableInputInterface> { Some(self) } + + fn as_streamable_mut(&mut self) -> Option<&mut dyn StreamableInputInterface> { + Some(self) + } } impl StreamableInputInterface for ArgvInput { diff --git a/crates/shirabe-external-packages/src/symfony/console/input/input_interface.rs b/crates/shirabe-external-packages/src/symfony/console/input/input_interface.rs index ccb5a98..6ef7877 100644 --- a/crates/shirabe-external-packages/src/symfony/console/input/input_interface.rs +++ b/crates/shirabe-external-packages/src/symfony/console/input/input_interface.rs @@ -48,4 +48,9 @@ pub trait InputInterface: std::fmt::Debug + shirabe_php_shim::AsAny { fn as_streamable(&self) -> Option<&dyn StreamableInputInterface> { None } + + /// Mutable counterpart of `as_streamable`, needed to call `set_stream`/`set_interactive`. + fn as_streamable_mut(&mut self) -> Option<&mut dyn StreamableInputInterface> { + None + } } diff --git a/crates/shirabe-external-packages/src/symfony/console/input/string_input.rs b/crates/shirabe-external-packages/src/symfony/console/input/string_input.rs index e04e519..c3a0262 100644 --- a/crates/shirabe-external-packages/src/symfony/console/input/string_input.rs +++ b/crates/shirabe-external-packages/src/symfony/console/input/string_input.rs @@ -4,6 +4,7 @@ use crate::symfony::console::exception::invalid_argument_exception::InvalidArgum use crate::symfony::console::input::argv_input::ArgvInput; use crate::symfony::console::input::input_definition::InputDefinition; use crate::symfony::console::input::input_interface::InputInterface; +use crate::symfony::console::input::streamable_input_interface::StreamableInputInterface; use indexmap::IndexMap; use shirabe_php_shim::{CaptureKey, PhpMixed}; @@ -210,4 +211,22 @@ impl InputInterface for StringInput { fn set_interactive(&mut self, interactive: bool) { self.inner.set_interactive(interactive) } + + fn as_streamable(&self) -> Option<&dyn StreamableInputInterface> { + Some(self) + } + + fn as_streamable_mut(&mut self) -> Option<&mut dyn StreamableInputInterface> { + Some(self) + } +} + +impl StreamableInputInterface for StringInput { + fn set_stream(&mut self, stream: shirabe_php_shim::PhpResource) { + self.inner.set_stream(stream) + } + + fn get_stream(&self) -> Option { + self.inner.get_stream() + } } -- cgit v1.3.1