diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-08-18 01:57:02 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-08-18 01:57:02 +0900 |
| commit | 0caac63bacefb9a1f62848636d47fca07f592bba (patch) | |
| tree | 8d2ef66e597a8d8c228d3ba2490a59f48b26db4d /crates/shirabe/src/command | |
| parent | 34c74255d781ad0a0bf7cc5ad4ec1761bef61e04 (diff) | |
| download | php-shirabe-0caac63bacefb9a1f62848636d47fca07f592bba.tar.gz php-shirabe-0caac63bacefb9a1f62848636d47fca07f592bba.tar.zst php-shirabe-0caac63bacefb9a1f62848636d47fca07f592bba.zip | |
refactor(preg): split PregMatches reads into get() and name()
PregMatches keyed both forms of a capture group through CaptureKey, so
every read built one: a usize wrapped in an enum, or worse, a String
allocated to name a group that regex::Captures can look up from a &str.
It now mirrors regex::Captures instead -- get() takes the group number,
name() the group name -- and the enum drops out of the type entirely.
That is 285 call sites across 59 files, and the named ones carry most of
the win: `matches.get(&CaptureKey::ByName("host".to_string()))` reads as
`matches.name("host")`. ProcessExecutor loses a `user_key` binding that
existed only to build the key once.
CaptureKey stays as the key type of PregMatchesAll and
PregMatchesAllWithOffsets, where numbered and named entries share one
IndexMap and a key type is the point. Five files still name it.
Also retargets the two preg_match_all comments that described the
occurrence count through `matches[&CaptureKey::ByIndex(0)].len()`, an
Index impl these types no longer carry.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/command')
| -rw-r--r-- | crates/shirabe/src/command/archive_command.rs | 12 | ||||
| -rw-r--r-- | crates/shirabe/src/command/config_command.rs | 45 | ||||
| -rw-r--r-- | crates/shirabe/src/command/create_project_command.rs | 9 | ||||
| -rw-r--r-- | crates/shirabe/src/command/diagnose_command.rs | 7 | ||||
| -rw-r--r-- | crates/shirabe/src/command/fund_command.rs | 4 | ||||
| -rw-r--r-- | crates/shirabe/src/command/init_command.rs | 10 | ||||
| -rw-r--r-- | crates/shirabe/src/command/package_discovery_trait.rs | 14 | ||||
| -rw-r--r-- | crates/shirabe/src/command/show_command.rs | 9 | ||||
| -rw-r--r-- | crates/shirabe/src/command/update_command.rs | 8 |
9 files changed, 39 insertions, 79 deletions
diff --git a/crates/shirabe/src/command/archive_command.rs b/crates/shirabe/src/command/archive_command.rs index c2166b45..31d25b3b 100644 --- a/crates/shirabe/src/command/archive_command.rs +++ b/crates/shirabe/src/command/archive_command.rs @@ -26,7 +26,7 @@ use crate::util::Platform; use crate::util::ProcessExecutor; use crate::util::r#loop::Loop; use indexmap::IndexMap; -use shirabe_pcre::{CaptureKey, Preg}; +use shirabe_pcre::Preg; use shirabe_php_shim::{LogicException, get_debug_type, impl_php_class, php_regex}; use shirabe_symfony_console::command::Command; use shirabe_symfony_console::input::InputInterface; @@ -232,14 +232,8 @@ impl ArchiveCommand { && let Some(matches) = Preg::match3(php_regex!(r"{@(stable|RC|beta|alpha|dev)$}i"), version_str) { - let m1 = matches - .get(&CaptureKey::ByIndex(1)) - .unwrap_or_default() - .to_string(); - let m0 = matches - .get(&CaptureKey::ByIndex(0)) - .unwrap_or_default() - .to_string(); + let m1 = matches.get(1).unwrap_or_default().to_string(); + let m0 = matches.get(0).unwrap_or_default().to_string(); min_stability = VersionParser::normalize_stability(&m1)?; let full_match_len = m0.len(); version = Some(version_str[..version_str.len() - full_match_len].to_string()); diff --git a/crates/shirabe/src/command/config_command.rs b/crates/shirabe/src/command/config_command.rs index 5022d09f..8f0cbc51 100644 --- a/crates/shirabe/src/command/config_command.rs +++ b/crates/shirabe/src/command/config_command.rs @@ -18,7 +18,7 @@ use crate::util::Filesystem; use crate::util::Platform; use crate::util::Silencer; use indexmap::IndexMap; -use shirabe_pcre::{CaptureKey, Preg}; +use shirabe_pcre::Preg; use shirabe_php_shim::{ InvalidArgumentException, PhpMixed, RuntimeException, array_is_list, array_merge, escapeshellcmd, exec, explode, file_exists, impl_php_class, implode, in_array_loose, @@ -705,16 +705,13 @@ impl Command for ConfigCommand { php_regex!("/^repos?(?:itories)?(?:\\.(.+))?/"), &setting_key, ) { - if matches.get(&CaptureKey::ByIndex(1)).is_none() { + if matches.get(1).is_none() { value = data .get("repositories") .cloned() .unwrap_or_else(|| PhpMixed::Array(IndexMap::new())); } else { - let repo_key = matches - .get(&CaptureKey::ByIndex(1)) - .unwrap_or_default() - .to_string(); + let repo_key = matches.get(1).unwrap_or_default().to_string(); let repos = data.get("repositories").cloned(); value = match repos .as_ref() @@ -1038,7 +1035,7 @@ impl Command for ConfigCommand { .borrow_mut() .as_mut() .unwrap() - .remove_repository(matches.get(&CaptureKey::ByIndex(1)).unwrap()); + .remove_repository(matches.get(1).unwrap()); return Ok(0); } @@ -1052,7 +1049,7 @@ impl Command for ConfigCommand { .as_mut() .unwrap() .add_repository( - matches.get(&CaptureKey::ByIndex(1)).unwrap(), + matches.get(1).unwrap(), PhpMixed::Array(repo), input.borrow().get_option("append")?.as_bool() == Some(true), ); @@ -1072,7 +1069,7 @@ impl Command for ConfigCommand { .as_mut() .unwrap() .add_repository( - matches.get(&CaptureKey::ByIndex(1)).unwrap(), + matches.get(1).unwrap(), PhpMixed::Bool(false), input.borrow().get_option("append")?.as_bool() == Some(true), ); @@ -1086,7 +1083,7 @@ impl Command for ConfigCommand { .as_mut() .unwrap() .add_repository( - matches.get(&CaptureKey::ByIndex(1)).unwrap(), + matches.get(1).unwrap(), value, input.borrow().get_option("append")?.as_bool() == Some(true), ); @@ -1336,8 +1333,8 @@ impl Command for ConfigCommand { .unwrap() .remove_config_setting(&format!( "{}.{}", - matches.get(&CaptureKey::ByIndex(1)).unwrap(), - matches.get(&CaptureKey::ByIndex(2)).unwrap() + matches.get(1).unwrap(), + matches.get(2).unwrap() )); self.config_source .borrow_mut() @@ -1345,19 +1342,15 @@ impl Command for ConfigCommand { .unwrap() .remove_config_setting(&format!( "{}.{}", - matches.get(&CaptureKey::ByIndex(1)).unwrap(), - matches.get(&CaptureKey::ByIndex(2)).unwrap() + matches.get(1).unwrap(), + matches.get(2).unwrap() )); return Ok(0); } - let key = format!( - "{}.{}", - matches.get(&CaptureKey::ByIndex(1)).unwrap(), - matches.get(&CaptureKey::ByIndex(2)).unwrap() - ); - if matches.get(&CaptureKey::ByIndex(1)).unwrap() == "bitbucket-oauth" { + let key = format!("{}.{}", matches.get(1).unwrap(), matches.get(2).unwrap()); + if matches.get(1).unwrap() == "bitbucket-oauth" { if 2 != values.len() { return Err(RuntimeException::new(format!( "Expected two arguments (consumer-key, consumer-secret), got {}", @@ -1384,9 +1377,7 @@ impl Command for ConfigCommand { .as_mut() .unwrap() .add_config_setting(&key, PhpMixed::Array(obj)); - } else if matches.get(&CaptureKey::ByIndex(1)).unwrap() == "gitlab-token" - && 2 == values.len() - { + } else if matches.get(1).unwrap() == "gitlab-token" && 2 == values.len() { self.config_source .borrow_mut() .as_mut() @@ -1401,7 +1392,7 @@ impl Command for ConfigCommand { .unwrap() .add_config_setting(&key, PhpMixed::Array(obj)); } else if matches!( - matches.get(&CaptureKey::ByIndex(1)).unwrap(), + matches.get(1).unwrap(), "github-oauth" | "gitlab-oauth" | "gitlab-token" | "bearer" ) { if 1 != values.len() { @@ -1420,7 +1411,7 @@ impl Command for ConfigCommand { .as_mut() .unwrap() .add_config_setting(&key, PhpMixed::String(values[0].clone())); - } else if matches.get(&CaptureKey::ByIndex(1)).unwrap() == "http-basic" { + } else if matches.get(1).unwrap() == "http-basic" { if 2 != values.len() { return Err(RuntimeException::new(format!( "Expected two arguments (username, password), got {}", @@ -1441,7 +1432,7 @@ impl Command for ConfigCommand { .as_mut() .unwrap() .add_config_setting(&key, PhpMixed::Array(obj)); - } else if matches.get(&CaptureKey::ByIndex(1)).unwrap() == "custom-headers" { + } else if matches.get(1).unwrap() == "custom-headers" { if values.is_empty() { return Err(RuntimeException::new( "Expected at least one argument (header), got none".to_string(), @@ -1482,7 +1473,7 @@ impl Command for ConfigCommand { .as_mut() .unwrap() .add_config_setting(&key, PhpMixed::List(formatted_headers)); - } else if matches.get(&CaptureKey::ByIndex(1)).unwrap() == "forgejo-token" { + } else if matches.get(1).unwrap() == "forgejo-token" { if 2 != values.len() { return Err(RuntimeException::new(format!( "Expected two arguments (username, access token), got {}", diff --git a/crates/shirabe/src/command/create_project_command.rs b/crates/shirabe/src/command/create_project_command.rs index 8d7b4072..f1b899d3 100644 --- a/crates/shirabe/src/command/create_project_command.rs +++ b/crates/shirabe/src/command/create_project_command.rs @@ -37,7 +37,7 @@ use crate::util::Filesystem; use crate::util::Platform; use crate::util::ProcessExecutor; use indexmap::IndexMap; -use shirabe_pcre::{CaptureKey, Preg}; +use shirabe_pcre::Preg; use shirabe_php_shim::Catch as _; use shirabe_php_shim::{ InvalidArgumentException, PhpMixed, RuntimeException, UnexpectedValueException, array_pop, @@ -540,12 +540,7 @@ impl CreateProjectCommand { package_version.as_deref().unwrap_or(""), ); if let Some(matched) = matched { - stability = Some( - matched - .get(&CaptureKey::ByIndex(1)) - .unwrap_or_default() - .to_string(), - ); + stability = Some(matched.get(1).unwrap_or_default().to_string()); } else { stability = Some(VersionParser::parse_stability( package_version.as_deref().unwrap_or(""), diff --git a/crates/shirabe/src/command/diagnose_command.rs b/crates/shirabe/src/command/diagnose_command.rs index 448de89f..820b026c 100644 --- a/crates/shirabe/src/command/diagnose_command.rs +++ b/crates/shirabe/src/command/diagnose_command.rs @@ -33,7 +33,7 @@ use crate::util::ProcessExecutor; use crate::util::http::ProxyManager; use crate::util::http::RequestProxy; use indexmap::IndexMap; -use shirabe_pcre::{CaptureKey, Preg}; +use shirabe_pcre::Preg; use shirabe_php_shim::Catch as _; use shirabe_php_shim::{ AnyThrowable, CmpOp, InvalidArgumentException, PHP_EOL, PhpClass as _, PhpMixed, @@ -866,10 +866,7 @@ impl DiagnoseCommand { php_regex!("{Configure Command(?: *</td><td class=\"v\">| *=> *)(.*?)(?:</td>|$)}m"), &diagnostics.phpinfo_general, ) { - let configure = phpinfo_match - .get(&CaptureKey::ByIndex(1)) - .unwrap_or_default() - .to_string(); + let configure = phpinfo_match.get(1).unwrap_or_default().to_string(); let configure = configure.as_str(); if configure.contains("--enable-sigchild") { diff --git a/crates/shirabe/src/command/fund_command.rs b/crates/shirabe/src/command/fund_command.rs index 22c94539..f900bce0 100644 --- a/crates/shirabe/src/command/fund_command.rs +++ b/crates/shirabe/src/command/fund_command.rs @@ -10,7 +10,7 @@ use crate::package::base_package::{self}; use crate::repository::CompositeRepository; use crate::repository::RepositoryInterface; use indexmap::IndexMap; -use shirabe_pcre::{CaptureKey, Preg}; +use shirabe_pcre::Preg; use shirabe_php_shim::{PhpMixed, impl_php_class, php_regex}; use shirabe_semver::constraint::AnyConstraint; use shirabe_semver::constraint::MatchAllConstraint; @@ -65,7 +65,7 @@ impl FundCommand { if r#type == "github" && let Some(matches) = Preg::is_match3(php_regex!(r"{^https://github.com/([^/]+)$}"), &url) - && let Some(sponsor) = matches.get(&CaptureKey::ByIndex(1)).map(str::to_string) + && let Some(sponsor) = matches.get(1).map(str::to_string) { url = format!("https://github.com/sponsors/{}", sponsor); } diff --git a/crates/shirabe/src/command/init_command.rs b/crates/shirabe/src/command/init_command.rs index 81e1e381..030a8657 100644 --- a/crates/shirabe/src/command/init_command.rs +++ b/crates/shirabe/src/command/init_command.rs @@ -94,9 +94,7 @@ impl InitCommand { php_regex!(r#"/^(?P<name>[- .,\p{L}\p{N}\p{Mn}\'’\"()]+)(?:\s+<(?P<email>.+?)>)?$/u"#), author, ) { - let email = m - .get(&CaptureKey::ByName("email".to_string())) - .map(str::to_string); + let email = m.name("email").map(str::to_string); if let Some(ref email) = email && !self.is_valid_email(email) { @@ -108,11 +106,7 @@ impl InitCommand { let mut result: IndexMap<String, Option<String>> = IndexMap::new(); result.insert( "name".to_string(), - Some(trim( - m.get(&CaptureKey::ByName("name".to_string())) - .unwrap_or_default(), - None, - )), + Some(trim(m.name("name").unwrap_or_default(), None)), ); result.insert("email".to_string(), email); diff --git a/crates/shirabe/src/command/package_discovery_trait.rs b/crates/shirabe/src/command/package_discovery_trait.rs index 5b53bcbd..d31b5894 100644 --- a/crates/shirabe/src/command/package_discovery_trait.rs +++ b/crates/shirabe/src/command/package_discovery_trait.rs @@ -19,7 +19,7 @@ use crate::repository::RepositorySet; use crate::repository::{RepositoryInterface, SearchResult}; use crate::util::Filesystem; use indexmap::IndexMap; -use shirabe_pcre::{CaptureKey, Preg}; +use shirabe_pcre::Preg; use shirabe_php_shim::Catch as _; use shirabe_php_shim::{ Exception, InvalidArgumentException, LogicException, PHP_EOL, PhpMixed, array_keys, @@ -334,27 +334,21 @@ pub trait PackageDiscoveryTrait: BaseCommand { php_regex!(r"{^\s*(?P<name>[\S/]+)(?:\s+(?P<version>\S+))?\s*$}"), &selection, ) { - if let Some(v) = m - .get(&CaptureKey::ByName("version".to_string())) - .map(str::to_string) - { + if let Some(v) = m.name("version").map(str::to_string) { // parsing `acme/example ~2.3` // validate version constraint version_parser_clone.parse_constraints(&v)?; return Ok(PhpMixed::String(format!( "{} {}", - m.get(&CaptureKey::ByName("name".to_string())) - .unwrap_or_default(), + m.name("name").unwrap_or_default(), v, ))); } // parsing `acme/example` return Ok(PhpMixed::String( - m.get(&CaptureKey::ByName("name".to_string())) - .unwrap_or_default() - .to_string(), + m.name("name").unwrap_or_default().to_string(), )); } diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs index b479c9a8..4be7873c 100644 --- a/crates/shirabe/src/command/show_command.rs +++ b/crates/shirabe/src/command/show_command.rs @@ -36,7 +36,7 @@ use crate::repository::RepositoryUtils; use crate::repository::RootPackageRepository; use crate::util::PackageInfo; use indexmap::IndexMap; -use shirabe_pcre::{CaptureKey, Preg}; +use shirabe_pcre::Preg; use shirabe_php_shim::{ CmpOp, DATE_ATOM, InvalidArgumentException, LogicException, PhpMixed, UnexpectedValueException, array_search, date_format_to_strftime, date_local, extension_loaded, impl_php_class, @@ -1378,12 +1378,9 @@ impl ShowCommand { &package.get_version(), ) { - let zero_major = groups - .get(&CaptureKey::ByName("zero_major".to_string())) - .unwrap_or_default() - .to_string(); + let zero_major = groups.name("zero_major").unwrap_or_default().to_string(); let first_meaningful = groups - .get(&CaptureKey::ByName("first_meaningful".to_string())) + .name("first_meaningful") .unwrap_or_default() .to_string() .parse::<i64>() diff --git a/crates/shirabe/src/command/update_command.rs b/crates/shirabe/src/command/update_command.rs index 5c119489..e9f0e3ce 100644 --- a/crates/shirabe/src/command/update_command.rs +++ b/crates/shirabe/src/command/update_command.rs @@ -27,7 +27,7 @@ use crate::repository::PlatformRepository; use crate::repository::RepositorySet; use crate::util::HttpDownloader; use indexmap::IndexMap; -use shirabe_pcre::{CaptureKey, Preg}; +use shirabe_pcre::Preg; use shirabe_php_shim::{ InvalidArgumentException, PhpMixed, RuntimeException, array_filter, array_intersect, array_keys, array_merge_map, array_search_in_vec, impl_php_class, php_regex, strtolower, @@ -464,10 +464,8 @@ impl Command for UpdateCommand { let Some(matches) = matches else { continue; }; - let constraint = parser.parse_constraints(&format!( - "~{}", - matches.get(&CaptureKey::ByIndex(1)).unwrap_or_default() - ))?; + let constraint = parser + .parse_constraints(&format!("~{}", matches.get(1).unwrap_or_default()))?; if let Some(existing) = temporary_constraints.get(&package.get_name()) { temporary_constraints.insert( package.get_name(), |
