aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/console/input
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-12 04:28:40 +0900
committernsfisis <nsfisis@gmail.com>2026-05-12 04:32:24 +0900
commitfbf8b80058669f258786a7d07c3467d5d09f2a4d (patch)
treebff6c6dbc68825673fd476389d4ad78d05386a3f /crates/shirabe/src/console/input
parent9245e7e003184067286398b05486e3e0f29d944e (diff)
downloadphp-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.rs66
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(())
+ }
+}