diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-28 22:43:11 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-28 22:43:43 +0900 |
| commit | eea4efe87e455742ec17881ee93d8095925e8516 (patch) | |
| tree | 6d242f4fdd0bf32f0494a6fbbd62bce9ed6e1dc7 /crates/shirabe/src/repository/repository_utils.rs | |
| parent | cc5d73c05a0abca2eebcc8a6afa0b1543ee49850 (diff) | |
| download | php-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.rs | 32 |
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); } } |
