aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/commands/licenses.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-10 01:18:44 +0900
committernsfisis <nsfisis@gmail.com>2026-05-10 01:18:44 +0900
commit4caf72463de598ea9b6454f3b7b7332dd0071318 (patch)
tree62f99c8a48e5b21d75ab70bfd374eb67215542c9 /crates/mozart/src/commands/licenses.rs
parent8cc1ba8a02c0318b65658f1634de378c780392b9 (diff)
downloadphp-mozart-4caf72463de598ea9b6454f3b7b7332dd0071318.tar.gz
php-mozart-4caf72463de598ea9b6454f3b7b7332dd0071318.tar.zst
php-mozart-4caf72463de598ea9b6454f3b7b7332dd0071318.zip
refactor(package): port RootPackageLoader into RootPackageData::from_raw
Mirrors Composer\Package\Loader\RootPackageLoader::load(): converts the parsed RawPackageData into fully typed RootPackageData with Link objects, defaulted fields, and trait-based accessors. Composer::package() now returns RootPackageData instead of RawPackageData, eliminating the pre-normalised JSON workaround noted in the previous comment.
Diffstat (limited to 'crates/mozart/src/commands/licenses.rs')
-rw-r--r--crates/mozart/src/commands/licenses.rs28
1 files changed, 16 insertions, 12 deletions
diff --git a/crates/mozart/src/commands/licenses.rs b/crates/mozart/src/commands/licenses.rs
index 344a5fa..7a3847f 100644
--- a/crates/mozart/src/commands/licenses.rs
+++ b/crates/mozart/src/commands/licenses.rs
@@ -4,6 +4,7 @@ use indexmap::IndexMap;
use mozart_core::console::Console;
use mozart_core::console::hyperlink;
use mozart_core::console_writeln;
+use mozart_core::package::Package;
use mozart_core::package_info;
use mozart_core::package_info::PackageUrls;
use mozart_core::package_sorter::sort_packages_alphabetically;
@@ -84,21 +85,24 @@ pub async fn execute(
let root = composer.package();
- // RawPackageData stores `license` as `Option<String>` only, so we
- // re-parse the composer.json to also accept the array form Composer
- // recognises via `RootPackageLoader`'s `(array) $config['license']`
- // coercion. Track widening `RawPackageData::license` separately.
+ // Re-parse composer.json to handle the array form of `license` —
+ // `RawPackageData` only deserializes the string form, so both string
+ // and array values must be read from the raw JSON here.
let root_licenses = read_root_licenses(&working_dir.join("composer.json"))?;
- let root_pretty_name = root.name.clone();
- let root_version = root
- .version
- .clone()
- .unwrap_or_else(|| "No version set".to_string());
+ let root_pretty_name = root.name().to_string();
+ let root_version = {
+ let v = root.pretty_version();
+ if v == "1.0.0+no-version-set" {
+ "No version set".to_string()
+ } else {
+ v.to_string()
+ }
+ };
let mut entries = if args.locked {
load_locked_entries(&working_dir, args.no_dev)?
} else {
- load_installed_entries(&working_dir, &root.require, args.no_dev)?
+ load_installed_entries(&working_dir, root.requires(), args.no_dev)?
};
sort_packages_alphabetically(&mut entries, |e| e.name.as_str());
@@ -138,9 +142,9 @@ fn read_root_licenses(composer_json_path: &std::path::Path) -> anyhow::Result<Ve
})
}
-fn load_installed_entries(
+fn load_installed_entries<V>(
working_dir: &std::path::Path,
- root_requires: &BTreeMap<String, String>,
+ root_requires: &BTreeMap<String, V>,
no_dev: bool,
) -> anyhow::Result<Vec<LicenseEntry>> {
let vendor_dir = working_dir.join("vendor");