From cd25c3e193f05a5e89bca2a1c706c85fdc9c9155 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 6 Jun 2026 02:13:59 +0900 Subject: refactor(repository): make read methods fallible and take &mut self Change RepositoryInterface and WritableRepositoryInterface read methods (find_package, find_packages, get_packages, load_packages, search, get_providers, get_canonical_packages) to take &mut self and return anyhow::Result, so lazy-loading repositories such as ComposerRepository can perform fallible I/O and mutate internal state on access. Update all implementors and call sites to propagate the Result and pass mutable references. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../shirabe/src/command/package_discovery_trait.rs | 33 +++++++++++----------- 1 file changed, 16 insertions(+), 17 deletions(-) (limited to 'crates/shirabe/src/command/package_discovery_trait.rs') diff --git a/crates/shirabe/src/command/package_discovery_trait.rs b/crates/shirabe/src/command/package_discovery_trait.rs index eba6b8b..1f2ef5b 100644 --- a/crates/shirabe/src/command/package_discovery_trait.rs +++ b/crates/shirabe/src/command/package_discovery_trait.rs @@ -56,7 +56,7 @@ pub trait PackageDiscoveryTrait { fn normalize_requirements(&self, requires: Vec) -> Vec>; - fn get_repos(&mut self) -> &CompositeRepository { + fn get_repos(&mut self) -> &mut CompositeRepository { if self.get_repos_mut().is_none() { // PHP: array_merge([new PlatformRepository], RepositoryFactory::defaultReposWithDefaultManager($this->getIO())) let mut repos: Vec = vec![ @@ -75,7 +75,7 @@ pub trait PackageDiscoveryTrait { *self.get_repos_mut() = Some(CompositeRepository::new(repos)); } - self.get_repos_mut().as_ref().unwrap() + self.get_repos_mut().as_mut().unwrap() } /// @param key-of|null $minimumStability @@ -238,7 +238,7 @@ pub trait PackageDiscoveryTrait { .map(|rm| rm.get_local_repository()); let mut existing_packages: Vec = vec![]; if let Some(repo) = &installed_repo { - for package in repo.get_packages() { + for package in repo.get_packages()? { existing_packages.push(package.get_name().to_string()); } } @@ -533,7 +533,7 @@ pub trait PackageDiscoveryTrait { } // Check if it is a virtual package provided by others - let providers = repo_set.get_providers(name); + let providers = repo_set.get_providers(name)?; if count(&PhpMixed::List( providers.iter().map(|_| Box::new(PhpMixed::Null)).collect(), )) > 0 @@ -593,7 +593,7 @@ pub trait PackageDiscoveryTrait { self.get_platform_exception_details( candidate.clone(), platform_repo, - ), + )?, ), &[PhpMixed::String(name.to_string())], ), @@ -694,7 +694,7 @@ pub trait PackageDiscoveryTrait { self.get_platform_exception_details( candidate.clone(), platform_repo, - ), + )?, ), &[ PhpMixed::String(name.to_string()), @@ -816,11 +816,10 @@ pub trait PackageDiscoveryTrait { } .into()); } - Ok(self - .get_repos_mut() + self.get_repos_mut() .as_mut() .unwrap() - .search(package.to_string(), 0, None)) + .search(package.to_string(), 0, None) })() { Ok(r) => r, Err(e) => { @@ -847,7 +846,7 @@ pub trait PackageDiscoveryTrait { .find_package( &result.name, crate::repository::FindPackageConstraint::String("*".to_string()), - ) + )? .is_some() { // Ignore installed package @@ -864,13 +863,13 @@ pub trait PackageDiscoveryTrait { &self, candidate: PackageInterfaceHandle, platform_repo: Option<&PlatformRepositoryHandle>, - ) -> String { + ) -> anyhow::Result { let mut details: Vec = vec![]; let platform_repo = match platform_repo { - None => return String::new(), + None => return Ok(String::new()), Some(p) => p, }; - let platform_repo = platform_repo.borrow(); + let mut platform_repo = platform_repo.borrow_mut(); for link in candidate.get_requires().values() { if !PlatformRepository::is_platform_package(link.get_target()) { @@ -879,7 +878,7 @@ pub trait PackageDiscoveryTrait { let platform_pkg = platform_repo.find_package( link.get_target(), crate::repository::FindPackageConstraint::String("*".to_string()), - ); + )?; let platform_pkg = match platform_pkg { None => { if platform_repo.is_platform_package_disabled(link.get_target()) { @@ -941,13 +940,13 @@ pub trait PackageDiscoveryTrait { details.iter().map(|_| Box::new(PhpMixed::Null)).collect(), )) == 0 { - return String::new(); + return Ok(String::new()); } - format!( + Ok(format!( ":{} - {}", PHP_EOL, implode(&format!("{} - ", PHP_EOL), &details) - ) + )) } } -- cgit v1.3.1