diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-08-06 04:59:34 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-08-06 04:59:34 +0900 |
| commit | 0b227a4c623c72c155b1622674b78ca5cc0c4f8b (patch) | |
| tree | 89516c5d863bb83324dae7f78fe1d6284cf3fe44 /crates/shirabe | |
| parent | fabc0719224d194c6ea1ea7d8f6e9f0175ca7af5 (diff) | |
| download | php-shirabe-0b227a4c623c72c155b1622674b78ca5cc0c4f8b.tar.gz php-shirabe-0b227a4c623c72c155b1622674b78ca5cc0c4f8b.tar.zst php-shirabe-0b227a4c623c72c155b1622674b78ca5cc0c4f8b.zip | |
refactor(spdx-licenses): return a dedicated type from getLicenseByIdentifier
PHP hands back a positional array, so every caller had to reach into a
PhpMixed list by index and fall back to a default when an element was
missing or the wrong variant -- fallbacks that could never fire, since
the list shape is fixed. LicenseMetadata names the four elements and
makes the accesses total.
This also drops the crate's last use of PhpMixed, and with it the
dependency on shirabe-php-shim.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe')
| -rw-r--r-- | crates/shirabe/src/command/show_command.rs | 41 | ||||
| -rw-r--r-- | crates/shirabe/src/util/config_validator.rs | 42 |
2 files changed, 25 insertions, 58 deletions
diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs index a6bb906d..77d81858 100644 --- a/crates/shirabe/src/command/show_command.rs +++ b/crates/shirabe/src/command/show_command.rs @@ -2020,24 +2020,13 @@ impl ShowCommand { let out = match license { None => license_id.clone(), Some(license) => { - // SpdxLicenses::getLicenseByIdentifier returns [0 => fullname, 1 => osiApproved, 2 => url]. - let list = license.as_list(); - let fullname = list - .and_then(|l| l.first()) - .and_then(|v| v.as_string()) - .unwrap_or("") - .to_string(); - let is_osi = - list.and_then(|l| l.get(1)).and_then(|v| v.as_bool()) == Some(true); - let url = list - .and_then(|l| l.get(2)) - .and_then(|v| v.as_string()) - .unwrap_or("") - .to_string(); - if is_osi { - format!("{} ({}) (OSI approved) {}", fullname, license_id, url) + if license.is_osi_approved { + format!( + "{} ({}) (OSI approved) {}", + license.name, license_id, license.url + ) } else { - format!("{} ({}) {}", fullname, license_id, url) + format!("{} ({}) {}", license.name, license_id, license.url) } } }; @@ -2268,23 +2257,11 @@ impl ShowCommand { match license { None => PhpMixed::String(license_id), Some(l) => { - // PHP shape: ['name' => $license[0], 'osi' => $licenseId, 'url' => $license[2]]. - // Note 'osi' is the license id string, not the OSI-approved flag. - let list = l.as_list(); - let name = list - .and_then(|x| x.first()) - .and_then(|v| v.as_string()) - .unwrap_or("") - .to_string(); - let url = list - .and_then(|x| x.get(2)) - .and_then(|v| v.as_string()) - .unwrap_or("") - .to_string(); + // The 'osi' key holds the license id string, not the OSI-approved flag. let mut m: IndexMap<String, PhpMixed> = IndexMap::new(); - m.insert("name".to_string(), PhpMixed::String(name)); + m.insert("name".to_string(), PhpMixed::String(l.name)); m.insert("osi".to_string(), PhpMixed::String(license_id)); - m.insert("url".to_string(), PhpMixed::String(url)); + m.insert("url".to_string(), PhpMixed::String(l.url)); PhpMixed::Array(m.into_iter().collect()) } } diff --git a/crates/shirabe/src/util/config_validator.rs b/crates/shirabe/src/util/config_validator.rs index 35f14192..9b6b292d 100644 --- a/crates/shirabe/src/util/config_validator.rs +++ b/crates/shirabe/src/util/config_validator.rs @@ -116,33 +116,23 @@ impl ConfigValidator { let license_validator = SpdxLicenses::new(); for license in &licenses { let spdx_license = license_validator.get_license_by_identifier(license); - if let Some(spdx_license) = spdx_license { - // PHP: $spdxLicense[3] — fourth element is the deprecated flag. - let is_deprecated = match &spdx_license { - PhpMixed::List(l) => l.get(3).and_then(|v| v.as_bool()).unwrap_or(false), - _ => false, - }; - if is_deprecated { - if Preg::is_match(php_regex!(r"{^[AL]?GPL-[123](\.[01])?\+$}i"), license) { - warnings.push(format!( - "License \"{}\" is a deprecated SPDX license identifier, use \"{}-or-later\" instead", - license, - license.replace('+', "") - )); - } else if Preg::is_match( - php_regex!(r"{^[AL]?GPL-[123](\.[01])?$}i"), + if spdx_license.is_some_and(|l| l.is_deprecated_license_id) { + if Preg::is_match(php_regex!(r"{^[AL]?GPL-[123](\.[01])?\+$}i"), license) { + warnings.push(format!( + "License \"{}\" is a deprecated SPDX license identifier, use \"{}-or-later\" instead", license, - ) { - warnings.push(format!( - "License \"{}\" is a deprecated SPDX license identifier, use \"{}-only\" or \"{}-or-later\" instead", - license, license, license - )); - } else { - warnings.push(format!( - "License \"{}\" is a deprecated SPDX license identifier, see https://spdx.org/licenses/", - license - )); - } + license.replace('+', "") + )); + } else if Preg::is_match(php_regex!(r"{^[AL]?GPL-[123](\.[01])?$}i"), license) { + warnings.push(format!( + "License \"{}\" is a deprecated SPDX license identifier, use \"{}-only\" or \"{}-or-later\" instead", + license, license, license + )); + } else { + warnings.push(format!( + "License \"{}\" is a deprecated SPDX license identifier, see https://spdx.org/licenses/", + license + )); } } } |
