diff options
Diffstat (limited to 'crates/shirabe-external-packages')
3 files changed, 58 insertions, 0 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console.rs b/crates/shirabe-external-packages/src/symfony/console.rs index 986c9ca8..814e53a3 100644 --- a/crates/shirabe-external-packages/src/symfony/console.rs +++ b/crates/shirabe-external-packages/src/symfony/console.rs @@ -15,6 +15,7 @@ pub mod question; pub mod signal_registry; pub mod style; pub mod terminal; +pub mod tester; pub use application::*; pub use attribute::*; diff --git a/crates/shirabe-external-packages/src/symfony/console/tester.rs b/crates/shirabe-external-packages/src/symfony/console/tester.rs new file mode 100644 index 00000000..1a7f6d0c --- /dev/null +++ b/crates/shirabe-external-packages/src/symfony/console/tester.rs @@ -0,0 +1,3 @@ +pub mod command_completion_tester; + +pub use command_completion_tester::*; diff --git a/crates/shirabe-external-packages/src/symfony/console/tester/command_completion_tester.rs b/crates/shirabe-external-packages/src/symfony/console/tester/command_completion_tester.rs new file mode 100644 index 00000000..35da1b9d --- /dev/null +++ b/crates/shirabe-external-packages/src/symfony/console/tester/command_completion_tester.rs @@ -0,0 +1,54 @@ +//! ref: composer/vendor/symfony/console/Tester/CommandCompletionTester.php + +use crate::symfony::console::command::command::Command; +use crate::symfony::console::completion::completion_input::CompletionInput; +use crate::symfony::console::completion::completion_suggestions::CompletionSuggestions; + +/// Eases the testing of command completion. +#[derive(Debug)] +pub struct CommandCompletionTester { + command: std::rc::Rc<std::cell::RefCell<dyn Command>>, +} + +impl CommandCompletionTester { + pub fn new(command: std::rc::Rc<std::cell::RefCell<dyn Command>>) -> Self { + Self { command } + } + + /// Create completion suggestions from input tokens. + pub fn complete(&self, input: &[&str]) -> anyhow::Result<Vec<String>> { + let mut input: Vec<String> = input.iter().map(|s| s.to_string()).collect(); + let current_index = input.len() as i64; + if input.last().map(String::as_str) == Some("") { + input.pop(); + } + // array_unshift($input, $this->command->getName()) + input.insert(0, self.command.borrow().get_name().unwrap_or_default()); + + let mut completion_input = CompletionInput::from_tokens(input, current_index)?; + { + let command_ref = self.command.borrow(); + let definition = command_ref.get_definition(); + completion_input.bind(&definition)?; + } + let mut suggestions = CompletionSuggestions::new(); + + self.command + .borrow() + .complete(&completion_input, &mut suggestions)?; + + let mut result: Vec<String> = suggestions + .get_option_suggestions() + .iter() + .map(|option| format!("--{}", option.get_name())) + .collect(); + // array_map('strval', ... $suggestions->getValueSuggestions()) + result.extend( + suggestions + .get_value_suggestions() + .iter() + .map(|suggestion| suggestion.to_string()), + ); + Ok(result) + } +} |
