From bbb2f9454b6580fcbd337ced61b5a1888d52ce8d Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 5 Jun 2026 01:50:16 +0900 Subject: refactor(io): model ask_and_validate validators with anyhow::Result PHP's askAndValidate throws when a validator rejects input. Change the IOInterface validator callback and return type to anyhow::Result so the call sites can return Err instead of panic, faithfully modeling the throw semantics already supported by the Question layer. Co-Authored-By: Claude Opus 4.8 --- crates/shirabe/src/io/console_io.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'crates/shirabe/src/io/console_io.rs') diff --git a/crates/shirabe/src/io/console_io.rs b/crates/shirabe/src/io/console_io.rs index b69b68b..44e5609 100644 --- a/crates/shirabe/src/io/console_io.rs +++ b/crates/shirabe/src/io/console_io.rs @@ -487,10 +487,10 @@ impl IOInterfaceImmutable for ConsoleIO { fn ask_and_validate( &self, question: String, - validator: Box PhpMixed>, + validator: Box anyhow::Result>, attempts: Option, default: PhpMixed, - ) -> PhpMixed { + ) -> anyhow::Result { let _helper = self.helper_set.get("question"); let sanitized_question = Self::sanitize(PhpMixed::String(question), true) .as_string() @@ -502,13 +502,10 @@ impl IOInterfaceImmutable for ConsoleIO { Some(default) }; let mut question = Question::new(&sanitized_question, sanitized_default); - // TODO(phase-b): IOInterface validator type is Box PhpMixed> - // but Question::set_validator expects Option) -> Result>>. - // Bridge the signatures by adapting the input/output types. + // Question::set_validator takes Fn(Option) -> Result; adapt the + // None answer to PHP's null and forward the validator's Result unchanged. let adapted: Box) -> anyhow::Result> = - Box::new(move |answer: Option| { - Ok(validator(answer.unwrap_or(PhpMixed::Null))) - }); + Box::new(move |answer: Option| validator(answer.unwrap_or(PhpMixed::Null))); question.set_validator(Some(adapted)); question.set_max_attempts(attempts); -- cgit v1.3.1