diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-08-18 08:37:30 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-08-18 08:37:30 +0900 |
| commit | 4856f05e870ec5d2daaa74bf9a86a1519a813614 (patch) | |
| tree | ab81b7a9d59340c4d05ecaf3b6b1a81106cc8355 /crates/shirabe-symfony-console/src/command | |
| parent | 5aaa92f760a975c6617b5d1fb7af8e58fed127b7 (diff) | |
| download | php-shirabe-4856f05e870ec5d2daaa74bf9a86a1519a813614.tar.gz php-shirabe-4856f05e870ec5d2daaa74bf9a86a1519a813614.tar.zst php-shirabe-4856f05e870ec5d2daaa74bf9a86a1519a813614.zip | |
fix(input): return a bool|string|string[]|null enum from get_option
`InputInterface::get_option` returned `PhpMixed`, so the negation branch
of `Input::get_option` reproduced PHP's `return !$value;` as
`!value.as_bool().unwrap_or(false)`, which inverts the result for a
string value instead of leaving it `false`. It now returns
`InputOptionValue`, whose `to_bool` is PHP's truthiness cast.
The narrowing also removes the `Vec<PhpMixed>` element handling the
commands carried for array options: `as_array` hands back `&[String]`,
so the `filter_map(|v| v.as_string())` chains at eight call sites
collapse. Its other accessors keep `PhpMixed`'s names and meanings
(`is_null`, `as_bool`, `as_string`, `to_bool`), and
`From<InputOptionValue> for PhpMixed` covers the callers that feed the
value back into an `IndexMap<String, PhpMixed>` or a `PhpMixed`
parameter.
`Input` keeps its parsed options and `InputOption` its defaults as
`PhpMixed`, so `Input::get_option` is where the narrowing happens and
where a value outside the domain panics.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe-symfony-console/src/command')
3 files changed, 35 insertions, 13 deletions
diff --git a/crates/shirabe-symfony-console/src/command/complete_command.rs b/crates/shirabe-symfony-console/src/command/complete_command.rs index dc418178..432888b6 100644 --- a/crates/shirabe-symfony-console/src/command/complete_command.rs +++ b/crates/shirabe-symfony-console/src/command/complete_command.rs @@ -78,19 +78,26 @@ impl CompleteCommand { input: &dyn InputInterface, ) -> anyhow::Result<CompletionInput> { let current_index = input.get_option("current")?; - if !current_index.to_bool() || !shirabe_php_shim::ctype_digit(¤t_index.to_string()) { + if !current_index.to_bool() + || !shirabe_php_shim::ctype_digit(current_index.as_string().unwrap_or_default()) + { anyhow::bail!(shirabe_php_shim::RuntimeException::new( "The \"--current\" option must be set and it must be an integer.".to_string() )); } - let tokens: Vec<String> = match input.get_option("input")?.as_list() { - Some(list) => list.iter().map(|v| v.to_string()).collect(), - None => Vec::new(), - }; + let tokens: Vec<String> = input + .get_option("input")? + .as_array() + .map(<[String]>::to_vec) + .unwrap_or_default(); let mut completion_input = CompletionInput::from_tokens( tokens, - current_index.to_string().parse::<i64>().unwrap_or(0), + current_index + .as_string() + .unwrap_or_default() + .parse::<i64>() + .unwrap_or(0), )?; // try { $completionInput->bind(...); } catch (ExceptionInterface $e) {} @@ -254,13 +261,13 @@ impl Command for CompleteCommand { let completion_output = self .completion_outputs - .get(&shell.to_string()) + .get(shell.as_string().unwrap_or_default()) .cloned() .unwrap_or(PhpMixed::Bool(false)); if !completion_output.to_bool() { anyhow::bail!(shirabe_php_shim::RuntimeException::new(format!( "Shell completion is not supported for your shell: \"{}\" (supported: \"{}\").", - shell, + shell.as_string().unwrap_or_default(), self.completion_outputs .keys() .cloned() diff --git a/crates/shirabe-symfony-console/src/command/help_command.rs b/crates/shirabe-symfony-console/src/command/help_command.rs index 4f1447cb..2081e0e1 100644 --- a/crates/shirabe-symfony-console/src/command/help_command.rs +++ b/crates/shirabe-symfony-console/src/command/help_command.rs @@ -149,8 +149,14 @@ impl Command for HelpCommand { let mut helper = DescriptorHelper::new(); let object = DescribableObject::Command(self.command.borrow().clone().unwrap()); let mut options = indexmap::IndexMap::new(); - options.insert("format".to_string(), input.borrow().get_option("format")?); - options.insert("raw_text".to_string(), input.borrow().get_option("raw")?); + options.insert( + "format".to_string(), + input.borrow().get_option("format")?.into(), + ); + options.insert( + "raw_text".to_string(), + input.borrow().get_option("raw")?.into(), + ); helper.describe2(output.clone(), object, options)?; *self.command.borrow_mut() = None; diff --git a/crates/shirabe-symfony-console/src/command/list_command.rs b/crates/shirabe-symfony-console/src/command/list_command.rs index ead84d44..6074b49a 100644 --- a/crates/shirabe-symfony-console/src/command/list_command.rs +++ b/crates/shirabe-symfony-console/src/command/list_command.rs @@ -147,13 +147,22 @@ impl Command for ListCommand { let mut helper = DescriptorHelper::new(); let object = DescribableObject::Application(self.get_application().unwrap()); let mut options = indexmap::IndexMap::new(); - options.insert("format".to_string(), input.borrow().get_option("format")?); - options.insert("raw_text".to_string(), input.borrow().get_option("raw")?); + options.insert( + "format".to_string(), + input.borrow().get_option("format")?.into(), + ); + options.insert( + "raw_text".to_string(), + input.borrow().get_option("raw")?.into(), + ); options.insert( "namespace".to_string(), input.borrow().get_argument("namespace")?, ); - options.insert("short".to_string(), input.borrow().get_option("short")?); + options.insert( + "short".to_string(), + input.borrow().get_option("short")?.into(), + ); helper.describe2(output.clone(), object, options)?; Ok(0) |
