From 5114a8199a87c9e5584d92848e95deba22b73e98 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 18 Aug 2026 01:56:31 +0900 Subject: refactor(preg): back PregMatches with regex::Captures PregMatches was an IndexMap of owned Strings copied out of the match, so every preg_match2/preg_replace_callback call allocated a String per capture group (twice over for a named group) whether or not the caller read it. It now wraps the regex::Captures itself, held alongside the pattern it came from so groups stay reachable by both their named and their numbered form, and hands out &str borrowed from the subject. The subject's lifetime becomes a parameter of the type. Co-Authored-By: Claude Opus 5 (1M context) --- crates/shirabe-symfony-console/src/helper/progress_bar.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'crates/shirabe-symfony-console/src/helper/progress_bar.rs') diff --git a/crates/shirabe-symfony-console/src/helper/progress_bar.rs b/crates/shirabe-symfony-console/src/helper/progress_bar.rs index 4764d617..7a7a3c53 100644 --- a/crates/shirabe-symfony-console/src/helper/progress_bar.rs +++ b/crates/shirabe-symfony-console/src/helper/progress_bar.rs @@ -799,7 +799,10 @@ impl ProgressBar { // $callback in PHP, expressed as a closure over $this and the matches. let callback = |matches: &PregMatches| -> anyhow::Result { - let name = matches[&CaptureKey::ByIndex(1)].clone().unwrap_or_default(); + let name = matches + .get(&CaptureKey::ByIndex(1)) + .unwrap_or_default() + .to_string(); let text: shirabe_php_shim::PhpMixed = if Self::get_placeholder_formatter_definition(&name).is_some() { @@ -813,10 +816,13 @@ impl ProgressBar { } else if let Some(message) = self.messages.get(&name) { shirabe_php_shim::PhpMixed::String(message.clone()) } else { - return Ok(matches[&CaptureKey::ByIndex(0)].clone().unwrap_or_default()); + return Ok(matches + .get(&CaptureKey::ByIndex(0)) + .unwrap_or_default() + .to_string()); }; - if let Some(modifier) = matches.get(&CaptureKey::ByIndex(2)).and_then(|m| m.clone()) { + if let Some(modifier) = matches.get(&CaptureKey::ByIndex(2)) { return Ok(shirabe_php_shim::sprintf(&format!("%{modifier}"), &[text])); } -- cgit v1.3.1-4-g156e