aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs14
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/completion/completion_suggestions.rs9
-rw-r--r--crates/shirabe/src/console/application.rs13
3 files changed, 21 insertions, 15 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs b/crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs
index 7df1f802..d64e4a99 100644
--- a/crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/command/complete_command.rs
@@ -151,12 +151,14 @@ fn get_class_of_command(command: &Rc<RefCell<dyn Command>>) -> String {
todo!()
}
-/// $command->getDefinition()->getOptions()
-fn get_definition_options(_command: &Rc<RefCell<dyn Command>>) -> Vec<InputOption> {
- // TODO: InputDefinition::get_options() returns `&IndexMap<String, Rc<InputOption>>` but
- // CompletionSuggestions::suggest_options() takes `Vec<InputOption>`; the option ownership
- // model must be reconciled (Phase C).
- todo!()
+fn get_definition_options(command: &Rc<RefCell<dyn Command>>) -> Vec<Rc<InputOption>> {
+ command
+ .borrow()
+ .get_definition()
+ .get_options()
+ .values()
+ .cloned()
+ .collect()
}
/// new $completionOutput();
diff --git a/crates/shirabe-external-packages/src/symfony/console/completion/completion_suggestions.rs b/crates/shirabe-external-packages/src/symfony/console/completion/completion_suggestions.rs
index 2fb617ab..512056aa 100644
--- a/crates/shirabe-external-packages/src/symfony/console/completion/completion_suggestions.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/completion/completion_suggestions.rs
@@ -2,6 +2,7 @@
use crate::symfony::console::completion::suggestion::Suggestion;
use crate::symfony::console::input::input_option::InputOption;
+use std::rc::Rc;
/// PHP union type `string|Suggestion` used by `suggestValue`/`suggestValues`.
#[derive(Debug)]
@@ -14,7 +15,7 @@ pub enum StringOrSuggestion {
#[derive(Debug)]
pub struct CompletionSuggestions {
value_suggestions: Vec<Suggestion>,
- option_suggestions: Vec<InputOption>,
+ option_suggestions: Vec<Rc<InputOption>>,
}
impl Default for CompletionSuggestions {
@@ -51,14 +52,14 @@ impl CompletionSuggestions {
}
/// Add a suggestion for an input option name.
- pub fn suggest_option(&mut self, option: InputOption) -> &mut Self {
+ pub fn suggest_option(&mut self, option: Rc<InputOption>) -> &mut Self {
self.option_suggestions.push(option);
self
}
/// Add multiple suggestions for input option names at once.
- pub fn suggest_options(&mut self, options: Vec<InputOption>) -> &mut Self {
+ pub fn suggest_options(&mut self, options: Vec<Rc<InputOption>>) -> &mut Self {
for option in options {
self.suggest_option(option);
}
@@ -66,7 +67,7 @@ impl CompletionSuggestions {
self
}
- pub fn get_option_suggestions(&self) -> &Vec<InputOption> {
+ pub fn get_option_suggestions(&self) -> &Vec<Rc<InputOption>> {
&self.option_suggestions
}
diff --git a/crates/shirabe/src/console/application.rs b/crates/shirabe/src/console/application.rs
index 5591c84b..86639444 100644
--- a/crates/shirabe/src/console/application.rs
+++ b/crates/shirabe/src/console/application.rs
@@ -718,11 +718,14 @@ impl Application {
}
if CompletionInput::TYPE_OPTION_NAME == input.get_completion_type() {
- // $suggestions->suggestOptions($this->getDefinition()->getOptions());
- // TODO(review): get_options() yields Rc<InputOption> (shared, non-Clone) while
- // suggest_options() consumes owned InputOption values; an ownership/clone strategy
- // for InputOption is needed.
- suggestions.suggest_options(todo!("owned options from get_definition().get_options()"));
+ let options: Vec<std::rc::Rc<InputOption>> = self
+ .get_definition()
+ .borrow()
+ .get_options()
+ .values()
+ .cloned()
+ .collect();
+ suggestions.suggest_options(options);
return Ok(());
}