diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-12 04:28:40 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-12 04:32:24 +0900 |
| commit | fbf8b80058669f258786a7d07c3467d5d09f2a4d (patch) | |
| tree | bff6c6dbc68825673fd476389d4ad78d05386a3f /crates/shirabe/src/console/input | |
| parent | 9245e7e003184067286398b05486e3e0f29d944e (diff) | |
| download | php-shirabe-fbf8b80058669f258786a7d07c3467d5d09f2a4d.tar.gz php-shirabe-fbf8b80058669f258786a7d07c3467d5d09f2a4d.tar.zst php-shirabe-fbf8b80058669f258786a7d07c3467d5d09f2a4d.zip | |
feat(port): port InputArgument.php
Diffstat (limited to 'crates/shirabe/src/console/input')
| -rw-r--r-- | crates/shirabe/src/console/input/input_argument.rs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/crates/shirabe/src/console/input/input_argument.rs b/crates/shirabe/src/console/input/input_argument.rs index 4e705cf..fdd05d9 100644 --- a/crates/shirabe/src/console/input/input_argument.rs +++ b/crates/shirabe/src/console/input/input_argument.rs @@ -1 +1,67 @@ //! ref: composer/src/Composer/Console/Input/InputArgument.php + +use anyhow::Result; +use shirabe_external_packages::symfony::console::completion::completion_input::CompletionInput; +use shirabe_external_packages::symfony::console::completion::completion_suggestions::CompletionSuggestions; +use shirabe_external_packages::symfony::console::completion::suggestion::Suggestion; +use shirabe_external_packages::symfony::console::input::input_argument::InputArgument as BaseInputArgument; +use shirabe_php_shim::PhpMixed; + +pub enum SuggestedValues { + List(Vec<String>), + Closure(Box<dyn Fn(&CompletionInput, &mut CompletionSuggestions) -> Vec<StringOrSuggestion>>), +} + +impl std::fmt::Debug for SuggestedValues { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + SuggestedValues::List(list) => write!(f, "SuggestedValues::List({:?})", list), + SuggestedValues::Closure(_) => write!(f, "SuggestedValues::Closure(<closure>)"), + } + } +} + +pub enum StringOrSuggestion { + Str(String), + Suggestion(Suggestion), +} + +#[derive(Debug)] +pub struct InputArgument { + inner: BaseInputArgument, + suggested_values: SuggestedValues, +} + +impl InputArgument { + pub fn new( + name: &str, + mode: Option<i64>, + description: &str, + default: Option<PhpMixed>, + suggested_values: SuggestedValues, + ) -> Result<Self> { + let inner = BaseInputArgument::new(name, mode, description, default)?; + Ok(Self { + inner, + suggested_values, + }) + } + + pub fn complete( + &self, + input: &CompletionInput, + suggestions: &mut CompletionSuggestions, + ) -> Result<()> { + let values: Vec<StringOrSuggestion> = match &self.suggested_values { + SuggestedValues::List(list) => list + .iter() + .map(|s| StringOrSuggestion::Str(s.clone())) + .collect(), + SuggestedValues::Closure(closure) => closure(input, suggestions), + }; + if !values.is_empty() { + suggestions.suggest_values(values); + } + Ok(()) + } +} |
