aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/command/package_discovery_trait.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-06 02:13:59 +0900
committernsfisis <nsfisis@gmail.com>2026-06-06 02:13:59 +0900
commitcd25c3e193f05a5e89bca2a1c706c85fdc9c9155 (patch)
tree86971cac4e5011af0077416e6ca674c4251496ee /crates/shirabe/src/command/package_discovery_trait.rs
parentb299a0c9b66523b9630b4cf6d3dca1509c3692b5 (diff)
downloadphp-shirabe-cd25c3e193f05a5e89bca2a1c706c85fdc9c9155.tar.gz
php-shirabe-cd25c3e193f05a5e89bca2a1c706c85fdc9c9155.tar.zst
php-shirabe-cd25c3e193f05a5e89bca2a1c706c85fdc9c9155.zip
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) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/command/package_discovery_trait.rs')
-rw-r--r--crates/shirabe/src/command/package_discovery_trait.rs33
1 files changed, 16 insertions, 17 deletions
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<String>) -> Vec<IndexMap<String, String>>;
- 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<crate::repository::RepositoryInterfaceHandle> = 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<BasePackage::STABILITIES>|null $minimumStability
@@ -238,7 +238,7 @@ pub trait PackageDiscoveryTrait {
.map(|rm| rm.get_local_repository());
let mut existing_packages: Vec<String> = 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<String> {
let mut details: Vec<String> = 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)
- )
+ ))
}
}