aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository/array_repository.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/repository/array_repository.rs')
-rw-r--r--crates/shirabe/src/repository/array_repository.rs128
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(