aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-07-05 18:44:06 +0900
committernsfisis <nsfisis@gmail.com>2026-07-05 18:44:06 +0900
commit90ebddc8fd17bac1064fb5a0da88a9ad535f5a3c (patch)
tree31e8831df80401b45ded74dfa5e3581fedf6a942 /crates/shirabe/src/repository
parent8aae17870a5ec2fdd9f0d4d61d33c792ff7b62b0 (diff)
downloadphp-shirabe-90ebddc8fd17bac1064fb5a0da88a9ad535f5a3c.tar.gz
php-shirabe-90ebddc8fd17bac1064fb5a0da88a9ad535f5a3c.tar.zst
php-shirabe-90ebddc8fd17bac1064fb5a0da88a9ad535f5a3c.zip
feat(validating-array-loader): implement LoaderInterface
Convert errors/warnings/config to RefCell so load() can satisfy the trait's &self signature, matching upstream's `instanceof ValidatingArrayLoader` check in VcsRepository. This makes the InvalidPackageException downcast path in VcsRepository reachable for the first time instead of being permanently dead code.
Diffstat (limited to 'crates/shirabe/src/repository')
-rw-r--r--crates/shirabe/src/repository/package_repository.rs9
-rw-r--r--crates/shirabe/src/repository/vcs_repository.rs9
2 files changed, 8 insertions, 10 deletions
diff --git a/crates/shirabe/src/repository/package_repository.rs b/crates/shirabe/src/repository/package_repository.rs
index 1a5ccc8..0973332 100644
--- a/crates/shirabe/src/repository/package_repository.rs
+++ b/crates/shirabe/src/repository/package_repository.rs
@@ -4,6 +4,7 @@ use crate::advisory::{AnySecurityAdvisory, PartialSecurityAdvisory};
use crate::package::BasePackageHandle;
use crate::package::PackageInterfaceHandle;
use crate::package::loader::ArrayLoader;
+use crate::package::loader::LoaderInterface;
use crate::package::loader::ValidatingArrayLoader;
use crate::package::version::VersionParser;
use crate::repository::ArrayRepository;
@@ -53,15 +54,17 @@ impl PackageRepository {
pub fn initialize(&self) -> anyhow::Result<Result<(), InvalidRepositoryException>> {
self.inner.initialize();
- let mut loader =
+ let loader =
ValidatingArrayLoader::new(Box::new(ArrayLoader::new(None, true)), true, None, 0);
for package in &self.config {
let config_map: IndexMap<String, PhpMixed> = match package {
PhpMixed::Array(m) => m.iter().map(|(k, v)| (k.clone(), v.clone())).collect(),
_ => IndexMap::new(),
};
- let package_loaded = match loader.load(config_map, "Composer\\Package\\CompletePackage")
- {
+ let package_loaded = match loader.load(
+ config_map,
+ Some("Composer\\Package\\CompletePackage".to_string()),
+ ) {
Ok(p) => p,
Err(e) => {
let msg = format!(
diff --git a/crates/shirabe/src/repository/vcs_repository.rs b/crates/shirabe/src/repository/vcs_repository.rs
index 6a31c78..29702db 100644
--- a/crates/shirabe/src/repository/vcs_repository.rs
+++ b/crates/shirabe/src/repository/vcs_repository.rs
@@ -767,11 +767,6 @@ impl VcsRepository {
.unwrap()
.load(package_data.clone(), None)?;
// PHP: `$this->loader instanceof ValidatingArrayLoader`.
- // TODO(phase-c): ValidatingArrayLoader does not implement LoaderInterface yet (its
- // `load` needs `&mut self`, requiring a LoaderInterface redesign), so it can never be
- // stored in `self.loader` and this downcast is always None. Production never calls
- // setLoader so the default ArrayLoader matches upstream, but the InvalidPackageException
- // path stays dead until the trait is reworked.
let loader_ref = self.loader.borrow();
let loader_as_validating = loader_ref
.as_ref()
@@ -780,8 +775,8 @@ impl VcsRepository {
&& !validating.get_warnings().is_empty()
{
return Err(InvalidPackageException::new(
- validating.get_errors().to_vec(),
- validating.get_warnings().to_vec(),
+ validating.get_errors(),
+ validating.get_warnings(),
package_data,
)
.into());