aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository/repository_utils.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-28 22:43:11 +0900
committernsfisis <nsfisis@gmail.com>2026-05-28 22:43:43 +0900
commiteea4efe87e455742ec17881ee93d8095925e8516 (patch)
tree6d242f4fdd0bf32f0494a6fbbd62bce9ed6e1dc7 /crates/shirabe/src/repository/repository_utils.rs
parentcc5d73c05a0abca2eebcc8a6afa0b1543ee49850 (diff)
downloadphp-shirabe-eea4efe87e455742ec17881ee93d8095925e8516.tar.gz
php-shirabe-eea4efe87e455742ec17881ee93d8095925e8516.tar.zst
php-shirabe-eea4efe87e455742ec17881ee93d8095925e8516.zip
refactor(repository): introduce Rc<RefCell<_>> handles for repositories
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/repository/repository_utils.rs')
-rw-r--r--crates/shirabe/src/repository/repository_utils.rs32
1 files changed, 20 insertions, 12 deletions
diff --git a/crates/shirabe/src/repository/repository_utils.rs b/crates/shirabe/src/repository/repository_utils.rs
index 667cea2..4522039 100644
--- a/crates/shirabe/src/repository/repository_utils.rs
+++ b/crates/shirabe/src/repository/repository_utils.rs
@@ -3,7 +3,7 @@
use crate::package::Link;
use crate::repository::CompositeRepository;
use crate::repository::FilterRepository;
-use crate::repository::RepositoryInterface;
+use crate::repository::RepositoryInterfaceHandle;
use indexmap::IndexMap;
use std::any::Any;
@@ -39,23 +39,31 @@ impl RepositoryUtils {
}
pub fn flatten_repositories(
- repo: Box<dyn RepositoryInterface>,
+ repo: RepositoryInterfaceHandle,
unwrap_filter_repos: bool,
- ) -> Vec<Box<dyn RepositoryInterface>> {
- let repo: Box<dyn RepositoryInterface> = if unwrap_filter_repos {
- if let Some(filter_repo) = repo.as_any().downcast_ref::<FilterRepository>() {
- filter_repo.get_repository().clone_box()
- } else {
- repo
- }
+ ) -> Vec<RepositoryInterfaceHandle> {
+ let repo: RepositoryInterfaceHandle = if unwrap_filter_repos {
+ let unwrapped = {
+ let r = repo.borrow();
+ r.as_any()
+ .downcast_ref::<FilterRepository>()
+ .map(|filter_repo| filter_repo.get_repository())
+ };
+ unwrapped.unwrap_or(repo)
} else {
repo
};
- if let Some(composite_repo) = repo.as_any().downcast_ref::<CompositeRepository>() {
+ let nested = {
+ let r = repo.borrow();
+ r.as_any()
+ .downcast_ref::<CompositeRepository>()
+ .map(|composite_repo| composite_repo.get_repositories().clone())
+ };
+ if let Some(nested) = nested {
let mut repos = Vec::new();
- for r in composite_repo.get_repositories() {
- for r2 in Self::flatten_repositories(r.clone_box(), unwrap_filter_repos) {
+ for r in nested {
+ for r2 in Self::flatten_repositories(r, unwrap_filter_repos) {
repos.push(r2);
}
}