aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs130
-rw-r--r--crates/shirabe/src/command/global_command.rs3
2 files changed, 132 insertions, 1 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs b/crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs
index 8226b469..636e794c 100644
--- a/crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs
@@ -9,7 +9,7 @@ use shirabe_php_shim::{PhpMixed, php_regex};
///
/// This input allows unfinished option names or values and exposes what kind of
/// completion is expected.
-#[derive(Debug)]
+#[derive(Debug, Clone)]
pub struct CompletionInput {
inner: ArgvInput,
tokens: Vec<String>,
@@ -278,6 +278,134 @@ impl CompletionInput {
}
}
+/// PHP: `CompletionInput extends ArgvInput` — the inherited `InputInterface` surface,
+/// forwarded to the embedded `ArgvInput`. `bind` dispatches to the specialized
+/// `CompletionInput::bind` above, matching PHP's virtual dispatch.
+impl crate::symfony::console::input::input_interface::InputInterface for CompletionInput {
+ fn dup(
+ &self,
+ ) -> std::rc::Rc<
+ std::cell::RefCell<dyn crate::symfony::console::input::input_interface::InputInterface>,
+ > {
+ std::rc::Rc::new(std::cell::RefCell::new(self.clone()))
+ }
+
+ fn get_first_argument(&self) -> Option<String> {
+ self.inner.get_first_argument()
+ }
+
+ fn has_parameter_option(&self, values: PhpMixed, only_params: bool) -> bool {
+ crate::symfony::console::input::input_interface::InputInterface::has_parameter_option(
+ &self.inner,
+ values,
+ only_params,
+ )
+ }
+
+ fn get_parameter_option(
+ &self,
+ values: PhpMixed,
+ default: PhpMixed,
+ only_params: bool,
+ ) -> PhpMixed {
+ crate::symfony::console::input::input_interface::InputInterface::get_parameter_option(
+ &self.inner,
+ values,
+ default,
+ only_params,
+ )
+ }
+
+ fn bind(&mut self, definition: &InputDefinition) -> anyhow::Result<()> {
+ CompletionInput::bind(self, definition)
+ }
+
+ fn validate(&mut self) -> anyhow::Result<()> {
+ crate::symfony::console::input::input_interface::InputInterface::validate(&mut self.inner)
+ }
+
+ fn get_arguments(&self) -> indexmap::IndexMap<String, PhpMixed> {
+ crate::symfony::console::input::input_interface::InputInterface::get_arguments(&self.inner)
+ }
+
+ fn get_argument(&self, name: &str) -> anyhow::Result<PhpMixed> {
+ crate::symfony::console::input::input_interface::InputInterface::get_argument(
+ &self.inner,
+ name,
+ )
+ }
+
+ fn set_argument(&mut self, name: &str, value: PhpMixed) -> anyhow::Result<()> {
+ crate::symfony::console::input::input_interface::InputInterface::set_argument(
+ &mut self.inner,
+ name,
+ value,
+ )
+ }
+
+ fn has_argument(&self, name: &str) -> bool {
+ crate::symfony::console::input::input_interface::InputInterface::has_argument(
+ &self.inner,
+ name,
+ )
+ }
+
+ fn get_options(&self) -> indexmap::IndexMap<String, PhpMixed> {
+ crate::symfony::console::input::input_interface::InputInterface::get_options(&self.inner)
+ }
+
+ fn get_option(&self, name: &str) -> anyhow::Result<PhpMixed> {
+ crate::symfony::console::input::input_interface::InputInterface::get_option(
+ &self.inner,
+ name,
+ )
+ }
+
+ fn set_option(&mut self, name: &str, value: PhpMixed) -> anyhow::Result<()> {
+ crate::symfony::console::input::input_interface::InputInterface::set_option(
+ &mut self.inner,
+ name,
+ value,
+ )
+ }
+
+ fn has_option(&self, name: &str) -> bool {
+ crate::symfony::console::input::input_interface::InputInterface::has_option(
+ &self.inner,
+ name,
+ )
+ }
+
+ fn is_interactive(&self) -> bool {
+ crate::symfony::console::input::input_interface::InputInterface::is_interactive(&self.inner)
+ }
+
+ fn set_interactive(&mut self, interactive: bool) {
+ crate::symfony::console::input::input_interface::InputInterface::set_interactive(
+ &mut self.inner,
+ interactive,
+ )
+ }
+
+ fn as_streamable(
+ &self,
+ ) -> Option<
+ &dyn crate::symfony::console::input::streamable_input_interface::StreamableInputInterface,
+ > {
+ crate::symfony::console::input::input_interface::InputInterface::as_streamable(&self.inner)
+ }
+
+ fn as_streamable_mut(
+ &mut self,
+ ) -> Option<
+ &mut dyn crate::symfony::console::input::streamable_input_interface::StreamableInputInterface,
+ >{
+ crate::symfony::console::input::input_interface::InputInterface::as_streamable_mut(
+ &mut self.inner,
+ )
+ }
+}
+
impl std::fmt::Display for CompletionInput {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut str = String::new();
diff --git a/crates/shirabe/src/command/global_command.rs b/crates/shirabe/src/command/global_command.rs
index e70a2082..0414fd76 100644
--- a/crates/shirabe/src/command/global_command.rs
+++ b/crates/shirabe/src/command/global_command.rs
@@ -10,6 +10,7 @@ use crate::util::Filesystem;
use crate::util::Platform;
use shirabe_external_packages::composer::pcre::Preg;
use shirabe_external_packages::symfony::console::command::command::Command;
+use shirabe_external_packages::symfony::console::completion::completion_input::CompletionInput;
use shirabe_external_packages::symfony::console::input::ArgvInput;
use shirabe_external_packages::symfony::console::input::ArrayInput;
use shirabe_external_packages::symfony::console::input::InputInterface;
@@ -54,6 +55,8 @@ impl GlobalCommand {
Ok(array_input.to_string())
} else if let Some(string_input) = input_any.downcast_ref::<StringInput>() {
Ok(string_input.to_string())
+ } else if let Some(completion_input) = input_any.downcast_ref::<CompletionInput>() {
+ Ok(completion_input.to_string())
} else {
Err(LogicException {
message: "Expected an Input instance that is stringable".to_string(),