diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-28 15:50:49 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-28 15:50:49 +0900 |
| commit | e2955f0acb9e82448b1f72354e7e8dd6ab229ad5 (patch) | |
| tree | e06358115aec3057a5979e1bb144a132f1fd984e /crates/shirabe/src/repository/array_repository.rs | |
| parent | b62e7052ca528c68e9175d607e0ae3921e0784d9 (diff) | |
| download | php-shirabe-e2955f0acb9e82448b1f72354e7e8dd6ab229ad5.tar.gz php-shirabe-e2955f0acb9e82448b1f72354e7e8dd6ab229ad5.tar.zst php-shirabe-e2955f0acb9e82448b1f72354e7e8dd6ab229ad5.zip | |
feat(repository): impl RepositoryInterface for Artifact/Path/Vcs repos
The structural methods are inherited from ArrayRepository in PHP, where
the lazy package load is driven by the overridden initialize(). Without
virtual dispatch, each repository now ensures that load via a &self
ensure_initialized() before delegating to the inner ArrayRepository.
This required moving the repositories' lazily-populated state behind
interior mutability (RefCell/Cell) and adding &self find_package_internal
/find_packages_internal helpers on ArrayRepository.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/repository/array_repository.rs')
| -rw-r--r-- | crates/shirabe/src/repository/array_repository.rs | 128 |
1 files changed, 74 insertions, 54 deletions
diff --git a/crates/shirabe/src/repository/array_repository.rs b/crates/shirabe/src/repository/array_repository.rs index e1f8806..afe2cc5 100644 --- a/crates/shirabe/src/repository/array_repository.rs +++ b/crates/shirabe/src/repository/array_repository.rs @@ -48,6 +48,78 @@ impl ArrayRepository { self.packages.borrow().as_ref().unwrap().to_vec() } + // The RepositoryInterface findPackage/findPackages only need shared access to the package list; + // the `&mut self` on the trait methods is an artifact of the shared interface signature. These + // `&self` variants let callers that already hold a shared borrow (e.g. wrapper repositories + // initializing from a `&self` context) reuse the same logic. + pub(crate) fn find_package_internal( + &self, + name: &str, + constraint: FindPackageConstraint, + ) -> anyhow::Result<Option<BasePackageHandle>> { + let name = strtolower(name); + + let constraint: AnyConstraint = match constraint { + FindPackageConstraint::Constraint(c) => c, + FindPackageConstraint::String(s) => { + let version_parser = VersionParser::new(); + version_parser.parse_constraints(&s).unwrap().clone() + } + }; + + for package in self.get_packages_internal() { + if name == package.get_name() { + let pkg_constraint = SimpleConstraint::new( + "==".to_string(), + package.get_version().to_string(), + None, + ); + if constraint.matches(&pkg_constraint.into()) { + return Ok(Some(package)); + } + } + } + + Ok(None) + } + + pub(crate) fn find_packages_internal( + &self, + name: &str, + constraint: Option<FindPackageConstraint>, + ) -> anyhow::Result<Vec<BasePackageHandle>> { + // normalize name + let name = strtolower(name); + let mut packages = vec![]; + + let constraint: Option<AnyConstraint> = match constraint { + None => None, + Some(FindPackageConstraint::Constraint(c)) => Some(c), + Some(FindPackageConstraint::String(s)) => { + let version_parser = VersionParser::new(); + Some(version_parser.parse_constraints(&s).unwrap().clone()) + } + }; + + for package in self.get_packages_internal() { + if name == package.get_name() + && (constraint.is_none() + || constraint.as_ref().unwrap().matches( + &SimpleConstraint::new( + "==".to_string(), + package.get_version().to_string(), + None, + ) + .into(), + )) + { + packages.push(package); + } + } + + Ok(packages) + } + /// @param array<PackageInterface> $packages pub fn new(packages: Vec<PackageInterfaceHandle>) -> Result<Self> { let this = Self { @@ -243,30 +315,7 @@ impl RepositoryInterface for ArrayRepository { name: &str, constraint: FindPackageConstraint, ) -> anyhow::Result<Option<BasePackageHandle>> { - let name = strtolower(name); - - let constraint: AnyConstraint = match constraint { - FindPackageConstraint::Constraint(c) => c, - FindPackageConstraint::String(s) => { - let version_parser = VersionParser::new(); - version_parser.parse_constraints(&s).unwrap().clone() - } - }; - - for package in self.get_packages_internal() { - if name == package.get_name() { - let pkg_constraint = SimpleConstraint::new( - "==".to_string(), - package.get_version().to_string(), - None, - ); - if constraint.matches(&pkg_constraint.into()) { - return Ok(Some(package)); - } - } - } - - Ok(None) + self.find_package_internal(name, constraint) } fn find_packages( @@ -274,36 +323,7 @@ impl RepositoryInterface for ArrayRepository { name: &str, constraint: Option<FindPackageConstraint>, ) -> anyhow::Result<Vec<BasePackageHandle>> { - // normalize name - let name = strtolower(name); - let mut packages = vec![]; - - let constraint: Option<AnyConstraint> = match constraint { - None => None, - Some(FindPackageConstraint::Constraint(c)) => Some(c), - Some(FindPackageConstraint::String(s)) => { - let version_parser = VersionParser::new(); - Some(version_parser.parse_constraints(&s).unwrap().clone()) - } - }; - - for package in self.get_packages_internal() { - if name == package.get_name() - && (constraint.is_none() - || constraint.as_ref().unwrap().matches( - &SimpleConstraint::new( - "==".to_string(), - package.get_version().to_string(), - None, - ) - .into(), - )) - { - packages.push(package); - } - } - - Ok(packages) + self.find_packages_internal(name, constraint) } fn search( |
