From 4856f05e870ec5d2daaa74bf9a86a1519a813614 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 18 Aug 2026 08:37:30 +0900 Subject: 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` 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 for PhpMixed` covers the callers that feed the value back into an `IndexMap` 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) --- crates/shirabe/tests/installer_test.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'crates/shirabe/tests') diff --git a/crates/shirabe/tests/installer_test.rs b/crates/shirabe/tests/installer_test.rs index 05776557..4d24186f 100644 --- a/crates/shirabe/tests/installer_test.rs +++ b/crates/shirabe/tests/installer_test.rs @@ -52,6 +52,7 @@ use shirabe_symfony_console::command::CommandData; use shirabe_symfony_console::input::InputArgument; use shirabe_symfony_console::input::InputInterface; use shirabe_symfony_console::input::InputOption; +use shirabe_symfony_console::input::InputOptionValue; use shirabe_symfony_console::input::StringInput; use shirabe_symfony_console::output::StreamOutput; use shirabe_symfony_console::output::{OutputInterface, VERBOSITY_NORMAL}; @@ -828,10 +829,9 @@ fn ignore_platform_reqs_value(input: &dyn InputInterface) -> PhpMixed { } let list = input .get_option("ignore-platform-req") - .unwrap_or(PhpMixed::Bool(false)); + .unwrap_or(InputOptionValue::Bool(false)); match &list { - PhpMixed::List(items) if !items.is_empty() => list, - PhpMixed::Array(map) if !map.is_empty() => list, + InputOptionValue::Array(items) if !items.is_empty() => list.into(), _ => PhpMixed::Bool(false), } } -- cgit v1.3.1-4-g156e