From 901878ee3f2bee6605b02d321cc4c92bc32fd5b0 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 27 Jun 2026 08:44:57 +0900 Subject: refactor(composer): hold managers behind *Interface traits Composer/PartialComposer exposed its RepositoryManager, InstallationManager, EventDispatcher, Locker, DownloadManager, AutoloadGenerator and ArchiveManager as concrete types, but Composer's public setters (setDownloadManager() etc.) let plugins swap in subclasses. Introduce a *Interface trait per manager and store each as Rc> so a replacement is honored. Only Composer's slots and the sinks fed from its accessors become trait objects; managers injected concretely at construction keep their concrete references, matching PHP semantics. Fluent setters on the affected classes now return () and Locker::update_hash is de-generified to a boxed FnOnce so the traits stay object-safe. Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/shirabe/src/composer.rs | 102 +++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 40 deletions(-) (limited to 'crates/shirabe/src/composer.rs') diff --git a/crates/shirabe/src/composer.rs b/crates/shirabe/src/composer.rs index 57b4c6c..d6c41e2 100644 --- a/crates/shirabe/src/composer.rs +++ b/crates/shirabe/src/composer.rs @@ -3,15 +3,15 @@ use shirabe_external_packages::composer::pcre::Preg; -use crate::autoload::AutoloadGenerator; +use crate::autoload::AutoloadGeneratorInterface; use crate::config::Config; -use crate::downloader::DownloadManager; -use crate::event_dispatcher::EventDispatcher; -use crate::installer::InstallationManager; -use crate::package::archiver::ArchiveManager; -use crate::package::{Locker, RootPackageInterfaceHandle}; +use crate::downloader::DownloadManagerInterface; +use crate::event_dispatcher::EventDispatcherInterface; +use crate::installer::InstallationManagerInterface; +use crate::package::archiver::ArchiveManagerInterface; +use crate::package::{LockerInterface, RootPackageInterfaceHandle}; use crate::plugin::PluginManager; -use crate::repository::RepositoryManager; +use crate::repository::RepositoryManagerInterface; use crate::util::r#loop::Loop; // TODO: change this information to Shirabe version. @@ -37,10 +37,10 @@ pub struct PartialComposer { global: bool, package: Option, r#loop: Option>>, - repository_manager: Option>>, - installation_manager: Option>>, + repository_manager: Option>>, + installation_manager: Option>>, config: Option>>, - event_dispatcher: Option>>, + event_dispatcher: Option>>, } impl PartialComposer { @@ -70,34 +70,40 @@ impl PartialComposer { pub fn set_repository_manager( &mut self, - manager: std::rc::Rc>, + manager: std::rc::Rc>, ) { self.repository_manager = Some(manager); } - pub fn get_repository_manager(&self) -> std::rc::Rc> { + pub fn get_repository_manager( + &self, + ) -> std::rc::Rc> { self.repository_manager.as_ref().unwrap().clone() } pub fn set_installation_manager( &mut self, - manager: std::rc::Rc>, + manager: std::rc::Rc>, ) { self.installation_manager = Some(manager); } - pub fn get_installation_manager(&self) -> std::rc::Rc> { + pub fn get_installation_manager( + &self, + ) -> std::rc::Rc> { self.installation_manager.as_ref().unwrap().clone() } pub fn set_event_dispatcher( &mut self, - event_dispatcher: std::rc::Rc>, + event_dispatcher: std::rc::Rc>, ) { self.event_dispatcher = Some(event_dispatcher); } - pub fn get_event_dispatcher(&self) -> std::rc::Rc> { + pub fn get_event_dispatcher( + &self, + ) -> std::rc::Rc> { self.event_dispatcher.as_ref().unwrap().clone() } @@ -114,12 +120,12 @@ impl PartialComposer { #[derive(Debug)] pub struct Composer { partial: PartialComposer, - locker: Option>>, - download_manager: Option>>, + locker: Option>>, + download_manager: Option>>, // TODO(plugin): plugin_manager is part of the plugin API plugin_manager: Option>>, - autoload_generator: Option>>, - archive_manager: Option>>, + autoload_generator: Option>>, + archive_manager: Option>>, } impl Default for Composer { @@ -140,33 +146,37 @@ impl Composer { } } - pub fn set_locker(&mut self, locker: std::rc::Rc>) { + pub fn set_locker(&mut self, locker: std::rc::Rc>) { self.locker = Some(locker); } - pub fn get_locker(&self) -> std::rc::Rc> { + pub fn get_locker(&self) -> std::rc::Rc> { self.locker.as_ref().unwrap().clone() } pub fn set_download_manager( &mut self, - manager: std::rc::Rc>, + manager: std::rc::Rc>, ) { self.download_manager = Some(manager); } - pub fn get_download_manager(&self) -> std::rc::Rc> { + pub fn get_download_manager( + &self, + ) -> std::rc::Rc> { self.download_manager.as_ref().unwrap().clone() } pub fn set_archive_manager( &mut self, - manager: std::rc::Rc>, + manager: std::rc::Rc>, ) { self.archive_manager = Some(manager); } - pub fn get_archive_manager(&self) -> std::rc::Rc> { + pub fn get_archive_manager( + &self, + ) -> std::rc::Rc> { self.archive_manager.as_ref().unwrap().clone() } @@ -182,12 +192,14 @@ impl Composer { pub fn set_autoload_generator( &mut self, - autoload_generator: std::rc::Rc>, + autoload_generator: std::rc::Rc>, ) { self.autoload_generator = Some(autoload_generator); } - pub fn get_autoload_generator(&self) -> std::rc::Rc> { + pub fn get_autoload_generator( + &self, + ) -> std::rc::Rc> { self.autoload_generator.as_ref().unwrap().clone() } @@ -225,40 +237,45 @@ impl Composer { pub fn set_repository_manager( &mut self, - manager: std::rc::Rc>, + manager: std::rc::Rc>, ) { self.partial.set_repository_manager(manager); } pub fn get_repository_manager( &self, - ) -> std::rc::Rc> { + ) -> std::rc::Rc> { self.partial.get_repository_manager() } pub fn set_installation_manager( &mut self, - manager: std::rc::Rc>, + manager: std::rc::Rc< + std::cell::RefCell, + >, ) { self.partial.set_installation_manager(manager); } pub fn get_installation_manager( &self, - ) -> std::rc::Rc> { + ) -> std::rc::Rc> { self.partial.get_installation_manager() } pub fn set_event_dispatcher( &mut self, - dispatcher: std::rc::Rc>, + dispatcher: std::rc::Rc< + std::cell::RefCell, + >, ) { self.partial.set_event_dispatcher(dispatcher); } pub fn get_event_dispatcher( &self, - ) -> std::rc::Rc> { + ) -> std::rc::Rc> + { self.partial.get_event_dispatcher() } @@ -366,7 +383,7 @@ impl PartialOrFullComposer { pub fn set_repository_manager( &mut self, - manager: std::rc::Rc>, + manager: std::rc::Rc>, ) { match self { Self::Full(full) => full.set_repository_manager(manager), @@ -376,7 +393,7 @@ impl PartialOrFullComposer { pub fn get_repository_manager( &self, - ) -> std::rc::Rc> { + ) -> std::rc::Rc> { match self { Self::Full(full) => full.get_repository_manager(), Self::Partial(partial) => partial.get_repository_manager(), @@ -385,7 +402,9 @@ impl PartialOrFullComposer { pub fn set_installation_manager( &mut self, - manager: std::rc::Rc>, + manager: std::rc::Rc< + std::cell::RefCell, + >, ) { match self { Self::Full(full) => full.set_installation_manager(manager), @@ -395,7 +414,7 @@ impl PartialOrFullComposer { pub fn get_installation_manager( &self, - ) -> std::rc::Rc> { + ) -> std::rc::Rc> { match self { Self::Full(full) => full.get_installation_manager(), Self::Partial(partial) => partial.get_installation_manager(), @@ -404,7 +423,9 @@ impl PartialOrFullComposer { pub fn set_event_dispatcher( &mut self, - dispatcher: std::rc::Rc>, + dispatcher: std::rc::Rc< + std::cell::RefCell, + >, ) { match self { Self::Full(full) => full.set_event_dispatcher(dispatcher), @@ -414,7 +435,8 @@ impl PartialOrFullComposer { pub fn get_event_dispatcher( &self, - ) -> std::rc::Rc> { + ) -> std::rc::Rc> + { match self { Self::Full(full) => full.get_event_dispatcher(), Self::Partial(partial) => partial.get_event_dispatcher(), -- cgit v1.3.1