From 06e8e14520a4a38fed500581d2b75a42418b22c4 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 4 Jun 2026 21:09:02 +0900 Subject: feat(package): implement PackageInterface accessor layer for Package/CompletePackage/RootPackage Fill the trait-impl todo!() across the package accessor layer so loaded packages are actually usable (the ArrayLoader::load path depends on it): - Package: implement BasePackage/PackageInterface from struct fields and existing inherent methods; Display via get_unique_name. - CompletePackage: delegate PackageInterface to inner Package. - RootPackage: delegate CompletePackageInterface/PackageInterface to inner CompletePackage; RootPackageInterface link setters delegate to Package. Correct three unfaithful trait signatures found during implementation: - get_target_dir returns Option (PHP computes a normalized value; a borrow cannot represent it, and AliasPackage could not implement &str across its aliasOf handle). - RootPackageInterface link setters take IndexMap, matching Package and the real ArrayLoader caller (PHP RootPackage inherits Package::setRequires; the Link[] docblock was imprecise). - get_full_pretty_version takes a DisplayMode enum instead of a raw i64; the match is now exhaustive, so it returns String without an error path. Move mirror conversion to the boundaries: PackageInterface mirror methods use Vec (the typed form, matching the inherent methods), with array<->Mirror conversion done by the producer (ComposerRepository) and consumer (ArrayDumper). Co-Authored-By: Claude Opus 4.8 --- crates/shirabe/src/repository/composer_repository.rs | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'crates/shirabe/src/repository') diff --git a/crates/shirabe/src/repository/composer_repository.rs b/crates/shirabe/src/repository/composer_repository.rs index 1f2fcbf..9e5e48c 100644 --- a/crates/shirabe/src/repository/composer_repository.rs +++ b/crates/shirabe/src/repository/composer_repository.rs @@ -2772,26 +2772,22 @@ impl ComposerRepository { if let Some(mirrors) = self.source_mirrors.as_ref().and_then(|m| m.get(&src_type)) { - let converted: Vec> = mirrors + let converted: Vec = mirrors .iter() - .map(|m| { - let mut im: IndexMap = IndexMap::new(); - im.insert("url".to_string(), PhpMixed::String(m.url.clone())); - im.insert("preferred".to_string(), PhpMixed::Bool(m.preferred)); - im + .map(|m| crate::package::Mirror { + url: m.url.clone(), + preferred: m.preferred, }) .collect(); package.set_source_mirrors(Some(converted)); } } if let Some(dist_mirrors) = self.dist_mirrors.as_ref() { - let converted: Vec> = dist_mirrors + let converted: Vec = dist_mirrors .iter() - .map(|m| { - let mut im: IndexMap = IndexMap::new(); - im.insert("url".to_string(), PhpMixed::String(m.url.clone())); - im.insert("preferred".to_string(), PhpMixed::Bool(m.preferred)); - im + .map(|m| crate::package::Mirror { + url: m.url.clone(), + preferred: m.preferred, }) .collect(); package.set_dist_mirrors(Some(converted)); -- cgit v1.3.1