From eea4efe87e455742ec17881ee93d8095925e8516 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 28 May 2026 22:43:11 +0900 Subject: refactor(repository): introduce Rc> handles for repositories Co-Authored-By: Claude Opus 4.7 (1M context) --- .../shirabe/src/repository/repository_manager.rs | 32 ++++++++++++---------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'crates/shirabe/src/repository/repository_manager.rs') diff --git a/crates/shirabe/src/repository/repository_manager.rs b/crates/shirabe/src/repository/repository_manager.rs index 72c3643..dd69731 100644 --- a/crates/shirabe/src/repository/repository_manager.rs +++ b/crates/shirabe/src/repository/repository_manager.rs @@ -10,15 +10,14 @@ use crate::io::IOInterface; use crate::io::IOInterfaceImmutable; use crate::package::PackageInterfaceHandle; use crate::repository::FilterRepository; -use crate::repository::InstalledRepositoryInterface; -use crate::repository::RepositoryInterface; +use crate::repository::RepositoryInterfaceHandle; use crate::util::HttpDownloader; use crate::util::ProcessExecutor; #[derive(Debug)] pub struct RepositoryManager { - local_repository: Option>, - repositories: Vec>, + local_repository: Option, + repositories: Vec, repository_classes: IndexMap, io: std::rc::Rc>, config: std::rc::Rc>, @@ -62,7 +61,7 @@ impl RepositoryManager { name, crate::repository::FindPackageConstraint::Constraint(constraint.clone()), ) { - return Some(package.clone().into()); + return Some(package.into()); } } None @@ -81,17 +80,17 @@ impl RepositoryManager { constraint.clone(), )), ) { - packages.push(p.clone().into()); + packages.push(p); } } packages } - pub fn add_repository(&mut self, repository: Box) { + pub fn add_repository(&mut self, repository: RepositoryInterfaceHandle) { self.repositories.push(repository); } - pub fn prepend_repository(&mut self, repository: Box) { + pub fn prepend_repository(&mut self, repository: RepositoryInterfaceHandle) { self.repositories.insert(0, repository); } @@ -100,7 +99,7 @@ impl RepositoryManager { r#type: &str, config: IndexMap, name: Option<&str>, - ) -> anyhow::Result> { + ) -> anyhow::Result { if !self.repository_classes.contains_key(r#type) { return Err(InvalidArgumentException { message: format!("Repository type is not registered: {}", r#type), @@ -140,7 +139,10 @@ impl RepositoryManager { let repository = self.create_repository_by_class(&class, cleaned_config)?; if let Some(filter_config) = filter_config { - return Ok(Box::new(FilterRepository::new(repository, filter_config)?)); + return Ok(RepositoryInterfaceHandle::new(FilterRepository::new( + repository, + filter_config, + )?)); } Ok(repository) @@ -150,7 +152,7 @@ impl RepositoryManager { &self, _class: &str, _config: IndexMap, - ) -> anyhow::Result> { + ) -> anyhow::Result { todo!("Phase B: dynamic class instantiation by class name") } @@ -159,15 +161,15 @@ impl RepositoryManager { .insert(r#type.to_string(), class.to_string()); } - pub fn get_repositories(&self) -> &Vec> { + pub fn get_repositories(&self) -> &Vec { &self.repositories } - pub fn set_local_repository(&mut self, repository: Box) { + pub fn set_local_repository(&mut self, repository: RepositoryInterfaceHandle) { self.local_repository = Some(repository); } - pub fn get_local_repository(&self) -> &dyn InstalledRepositoryInterface { - self.local_repository.as_ref().unwrap().as_ref() + pub fn get_local_repository(&self) -> RepositoryInterfaceHandle { + self.local_repository.clone().unwrap() } } -- cgit v1.3.1