aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-06 18:21:02 +0900
committernsfisis <nsfisis@gmail.com>2026-06-06 18:21:02 +0900
commit23f8a0dc3e08949ec78e050b7642c605fa2aaaf5 (patch)
tree2633604624cb53695dfdc4d9597ff1d034c57eac /crates/shirabe/src
parentd5b313f388d424e60ae33ae58c1a65a65b24b8f1 (diff)
downloadphp-shirabe-23f8a0dc3e08949ec78e050b7642c605fa2aaaf5.tar.gz
php-shirabe-23f8a0dc3e08949ec78e050b7642c605fa2aaaf5.tar.zst
php-shirabe-23f8a0dc3e08949ec78e050b7642c605fa2aaaf5.zip
feat(composite-repository): forward remove_package to writable repos
Resolve the phase-b TODO by adding an as_writable_repository_interface_mut downcast helper on RepositoryInterface, mirroring PHP's instanceof WritableRepositoryInterface check, and propagate inner errors.
Diffstat (limited to 'crates/shirabe/src')
-rw-r--r--crates/shirabe/src/repository/composite_repository.rs14
-rw-r--r--crates/shirabe/src/repository/installed_array_repository.rs5
-rw-r--r--crates/shirabe/src/repository/installed_filesystem_repository.rs5
-rw-r--r--crates/shirabe/src/repository/repository_interface.rs6
4 files changed, 25 insertions, 5 deletions
diff --git a/crates/shirabe/src/repository/composite_repository.rs b/crates/shirabe/src/repository/composite_repository.rs
index 78bbc6a..97fad44 100644
--- a/crates/shirabe/src/repository/composite_repository.rs
+++ b/crates/shirabe/src/repository/composite_repository.rs
@@ -32,12 +32,16 @@ impl CompositeRepository {
&self.repositories
}
- pub fn remove_package(&mut self, _package: PackageInterfaceHandle) {
- // TODO(phase-b): only call remove_package on WritableRepositoryInterface implementors;
- // requires a downcast helper such as `as_writable() -> Option<&mut dyn WritableRepositoryInterface>` on RepositoryInterface.
- for _repository in &mut self.repositories {
- todo!()
+ pub fn remove_package(&mut self, package: PackageInterfaceHandle) -> anyhow::Result<()> {
+ for repository in &self.repositories {
+ if let Some(writable) = repository
+ .borrow_mut()
+ .as_writable_repository_interface_mut()
+ {
+ writable.remove_package(package.clone())?;
+ }
}
+ Ok(())
}
pub fn add_repository(&mut self, repository: RepositoryInterfaceHandle) {
diff --git a/crates/shirabe/src/repository/installed_array_repository.rs b/crates/shirabe/src/repository/installed_array_repository.rs
index 2d3965b..64098e9 100644
--- a/crates/shirabe/src/repository/installed_array_repository.rs
+++ b/crates/shirabe/src/repository/installed_array_repository.rs
@@ -151,6 +151,11 @@ impl RepositoryInterface for InstalledArrayRepository {
) -> Option<&mut dyn InstalledRepositoryInterface> {
Some(self)
}
+ fn as_writable_repository_interface_mut(
+ &mut self,
+ ) -> Option<&mut dyn crate::repository::WritableRepositoryInterface> {
+ Some(self)
+ }
fn as_any(&self) -> &dyn std::any::Any {
todo!()
}
diff --git a/crates/shirabe/src/repository/installed_filesystem_repository.rs b/crates/shirabe/src/repository/installed_filesystem_repository.rs
index 84bf1ca..1f6be2c 100644
--- a/crates/shirabe/src/repository/installed_filesystem_repository.rs
+++ b/crates/shirabe/src/repository/installed_filesystem_repository.rs
@@ -161,6 +161,11 @@ impl RepositoryInterface for InstalledFilesystemRepository {
) -> Option<&mut dyn InstalledRepositoryInterface> {
Some(self)
}
+ fn as_writable_repository_interface_mut(
+ &mut self,
+ ) -> Option<&mut dyn crate::repository::WritableRepositoryInterface> {
+ Some(self)
+ }
fn as_any(&self) -> &dyn std::any::Any {
todo!()
}
diff --git a/crates/shirabe/src/repository/repository_interface.rs b/crates/shirabe/src/repository/repository_interface.rs
index 249bd85..e3a5548 100644
--- a/crates/shirabe/src/repository/repository_interface.rs
+++ b/crates/shirabe/src/repository/repository_interface.rs
@@ -111,6 +111,12 @@ pub trait RepositoryInterface: Countable + std::fmt::Debug {
None
}
+ fn as_writable_repository_interface_mut(
+ &mut self,
+ ) -> Option<&mut dyn crate::repository::WritableRepositoryInterface> {
+ None
+ }
+
fn as_any(&self) -> &dyn std::any::Any;
/// Injects this repository's own weak handle so that `add_package` can wire package ->