From 23f8a0dc3e08949ec78e050b7642c605fa2aaaf5 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 6 Jun 2026 18:21:02 +0900 Subject: 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. --- crates/shirabe/src/repository/composite_repository.rs | 14 +++++++++----- .../shirabe/src/repository/installed_array_repository.rs | 5 +++++ .../src/repository/installed_filesystem_repository.rs | 5 +++++ crates/shirabe/src/repository/repository_interface.rs | 6 ++++++ 4 files changed, 25 insertions(+), 5 deletions(-) (limited to 'crates/shirabe/src') 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 -> -- cgit v1.3.1