From 1921f173ea219cb4b25847294d2d3fa465550fbb Mon Sep 17 00:00:00 2001 From: nsfisis Date: Mon, 25 May 2026 00:58:20 +0900 Subject: refactor(package): introduce Rc> handles for packages PHP packages have reference semantics, so introduce shared-ownership handles over an AnyPackage enum (PackageInterfaceHandle and friends) and replace Box throughout. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../shirabe/src/repository/composite_repository.rs | 27 ++++++---------------- 1 file changed, 7 insertions(+), 20 deletions(-) (limited to 'crates/shirabe/src/repository/composite_repository.rs') diff --git a/crates/shirabe/src/repository/composite_repository.rs b/crates/shirabe/src/repository/composite_repository.rs index 6671895..024f89a 100644 --- a/crates/shirabe/src/repository/composite_repository.rs +++ b/crates/shirabe/src/repository/composite_repository.rs @@ -5,8 +5,9 @@ use std::any::Any; use indexmap::IndexMap; use shirabe_semver::constraint::AnyConstraint; -use crate::package::BasePackage; +use crate::package::BasePackageHandle; use crate::package::PackageInterface; +use crate::package::PackageInterfaceHandle; use crate::repository::{ FindPackageConstraint, LoadPackagesResult, ProviderInfo, RepositoryInterface, SearchResult, }; @@ -79,7 +80,7 @@ impl RepositoryInterface for CompositeRepository { &self, name: &str, constraint: FindPackageConstraint, - ) -> Option> { + ) -> Option { for repository in &self.repositories { let package = repository.find_package(name, constraint.clone()); if package.is_some() { @@ -93,7 +94,7 @@ impl RepositoryInterface for CompositeRepository { &self, name: &str, constraint: Option, - ) -> Vec> { + ) -> Vec { let mut packages = vec![]; for repository in &self.repositories { packages.extend(repository.find_packages(name, constraint.clone())); @@ -101,7 +102,7 @@ impl RepositoryInterface for CompositeRepository { packages } - fn get_packages(&self) -> Vec> { + fn get_packages(&self) -> Vec { let mut packages = vec![]; for repository in &self.repositories { packages.extend(repository.get_packages()); @@ -114,35 +115,21 @@ impl RepositoryInterface for CompositeRepository { package_name_map: IndexMap>, acceptable_stabilities: IndexMap, stability_flags: IndexMap, - already_loaded: IndexMap>>, + already_loaded: IndexMap>, ) -> LoadPackagesResult { let mut all_packages = IndexMap::new(); let mut all_names_found = vec![]; for repository in &self.repositories { - // TODO(phase-b): manual deep clone since trait objects in maps don't derive Clone. let name_map_cloned: IndexMap> = package_name_map .iter() .map(|(k, v)| (k.clone(), v.as_ref().map(|c| c.clone()))) .collect(); - let already_loaded_cloned: IndexMap< - String, - IndexMap>, - > = already_loaded - .iter() - .map(|(k, inner)| { - let inner_cloned: IndexMap> = inner - .iter() - .map(|(ik, iv)| (ik.clone(), iv.clone_package_box())) - .collect(); - (k.clone(), inner_cloned) - }) - .collect(); let result = repository.load_packages( name_map_cloned, acceptable_stabilities.clone(), stability_flags.clone(), - already_loaded_cloned, + already_loaded.clone(), ); all_packages.extend(result.packages); all_names_found.extend(result.names_found); -- cgit v1.3.1