diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-27 08:44:57 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-27 08:44:57 +0900 |
| commit | 901878ee3f2bee6605b02d321cc4c92bc32fd5b0 (patch) | |
| tree | 83d8c8c9a24cb95c0656866d328b87c2d4c5127f /crates/shirabe/src/composer.rs | |
| parent | 5c2c72223cb6b4d77a332eeeeff7ee4e82e3f239 (diff) | |
| download | php-shirabe-901878ee3f2bee6605b02d321cc4c92bc32fd5b0.tar.gz php-shirabe-901878ee3f2bee6605b02d321cc4c92bc32fd5b0.tar.zst php-shirabe-901878ee3f2bee6605b02d321cc4c92bc32fd5b0.zip | |
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<RefCell<dyn ...Interface>> 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) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/composer.rs')
| -rw-r--r-- | crates/shirabe/src/composer.rs | 102 |
1 files changed, 62 insertions, 40 deletions
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<RootPackageInterfaceHandle>, r#loop: Option<std::rc::Rc<std::cell::RefCell<Loop>>>, - repository_manager: Option<std::rc::Rc<std::cell::RefCell<RepositoryManager>>>, - installation_manager: Option<std::rc::Rc<std::cell::RefCell<InstallationManager>>>, + repository_manager: Option<std::rc::Rc<std::cell::RefCell<dyn RepositoryManagerInterface>>>, + installation_manager: Option<std::rc::Rc<std::cell::RefCell<dyn InstallationManagerInterface>>>, config: Option<std::rc::Rc<std::cell::RefCell<Config>>>, - event_dispatcher: Option<std::rc::Rc<std::cell::RefCell<EventDispatcher>>>, + event_dispatcher: Option<std::rc::Rc<std::cell::RefCell<dyn EventDispatcherInterface>>>, } impl PartialComposer { @@ -70,34 +70,40 @@ impl PartialComposer { pub fn set_repository_manager( &mut self, - manager: std::rc::Rc<std::cell::RefCell<RepositoryManager>>, + manager: std::rc::Rc<std::cell::RefCell<dyn RepositoryManagerInterface>>, ) { self.repository_manager = Some(manager); } - pub fn get_repository_manager(&self) -> std::rc::Rc<std::cell::RefCell<RepositoryManager>> { + pub fn get_repository_manager( + &self, + ) -> std::rc::Rc<std::cell::RefCell<dyn RepositoryManagerInterface>> { self.repository_manager.as_ref().unwrap().clone() } pub fn set_installation_manager( &mut self, - manager: std::rc::Rc<std::cell::RefCell<InstallationManager>>, + manager: std::rc::Rc<std::cell::RefCell<dyn InstallationManagerInterface>>, ) { self.installation_manager = Some(manager); } - pub fn get_installation_manager(&self) -> std::rc::Rc<std::cell::RefCell<InstallationManager>> { + pub fn get_installation_manager( + &self, + ) -> std::rc::Rc<std::cell::RefCell<dyn InstallationManagerInterface>> { self.installation_manager.as_ref().unwrap().clone() } pub fn set_event_dispatcher( &mut self, - event_dispatcher: std::rc::Rc<std::cell::RefCell<EventDispatcher>>, + event_dispatcher: std::rc::Rc<std::cell::RefCell<dyn EventDispatcherInterface>>, ) { self.event_dispatcher = Some(event_dispatcher); } - pub fn get_event_dispatcher(&self) -> std::rc::Rc<std::cell::RefCell<EventDispatcher>> { + pub fn get_event_dispatcher( + &self, + ) -> std::rc::Rc<std::cell::RefCell<dyn EventDispatcherInterface>> { self.event_dispatcher.as_ref().unwrap().clone() } @@ -114,12 +120,12 @@ impl PartialComposer { #[derive(Debug)] pub struct Composer { partial: PartialComposer, - locker: Option<std::rc::Rc<std::cell::RefCell<Locker>>>, - download_manager: Option<std::rc::Rc<std::cell::RefCell<DownloadManager>>>, + locker: Option<std::rc::Rc<std::cell::RefCell<dyn LockerInterface>>>, + download_manager: Option<std::rc::Rc<std::cell::RefCell<dyn DownloadManagerInterface>>>, // TODO(plugin): plugin_manager is part of the plugin API plugin_manager: Option<std::rc::Rc<std::cell::RefCell<PluginManager>>>, - autoload_generator: Option<std::rc::Rc<std::cell::RefCell<AutoloadGenerator>>>, - archive_manager: Option<std::rc::Rc<std::cell::RefCell<ArchiveManager>>>, + autoload_generator: Option<std::rc::Rc<std::cell::RefCell<dyn AutoloadGeneratorInterface>>>, + archive_manager: Option<std::rc::Rc<std::cell::RefCell<dyn ArchiveManagerInterface>>>, } impl Default for Composer { @@ -140,33 +146,37 @@ impl Composer { } } - pub fn set_locker(&mut self, locker: std::rc::Rc<std::cell::RefCell<Locker>>) { + pub fn set_locker(&mut self, locker: std::rc::Rc<std::cell::RefCell<dyn LockerInterface>>) { self.locker = Some(locker); } - pub fn get_locker(&self) -> std::rc::Rc<std::cell::RefCell<Locker>> { + pub fn get_locker(&self) -> std::rc::Rc<std::cell::RefCell<dyn LockerInterface>> { self.locker.as_ref().unwrap().clone() } pub fn set_download_manager( &mut self, - manager: std::rc::Rc<std::cell::RefCell<DownloadManager>>, + manager: std::rc::Rc<std::cell::RefCell<dyn DownloadManagerInterface>>, ) { self.download_manager = Some(manager); } - pub fn get_download_manager(&self) -> std::rc::Rc<std::cell::RefCell<DownloadManager>> { + pub fn get_download_manager( + &self, + ) -> std::rc::Rc<std::cell::RefCell<dyn DownloadManagerInterface>> { self.download_manager.as_ref().unwrap().clone() } pub fn set_archive_manager( &mut self, - manager: std::rc::Rc<std::cell::RefCell<ArchiveManager>>, + manager: std::rc::Rc<std::cell::RefCell<dyn ArchiveManagerInterface>>, ) { self.archive_manager = Some(manager); } - pub fn get_archive_manager(&self) -> std::rc::Rc<std::cell::RefCell<ArchiveManager>> { + pub fn get_archive_manager( + &self, + ) -> std::rc::Rc<std::cell::RefCell<dyn ArchiveManagerInterface>> { 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<std::cell::RefCell<AutoloadGenerator>>, + autoload_generator: std::rc::Rc<std::cell::RefCell<dyn AutoloadGeneratorInterface>>, ) { self.autoload_generator = Some(autoload_generator); } - pub fn get_autoload_generator(&self) -> std::rc::Rc<std::cell::RefCell<AutoloadGenerator>> { + pub fn get_autoload_generator( + &self, + ) -> std::rc::Rc<std::cell::RefCell<dyn AutoloadGeneratorInterface>> { self.autoload_generator.as_ref().unwrap().clone() } @@ -225,40 +237,45 @@ impl Composer { pub fn set_repository_manager( &mut self, - manager: std::rc::Rc<std::cell::RefCell<crate::repository::RepositoryManager>>, + manager: std::rc::Rc<std::cell::RefCell<dyn crate::repository::RepositoryManagerInterface>>, ) { self.partial.set_repository_manager(manager); } pub fn get_repository_manager( &self, - ) -> std::rc::Rc<std::cell::RefCell<crate::repository::RepositoryManager>> { + ) -> std::rc::Rc<std::cell::RefCell<dyn crate::repository::RepositoryManagerInterface>> { self.partial.get_repository_manager() } pub fn set_installation_manager( &mut self, - manager: std::rc::Rc<std::cell::RefCell<crate::installer::InstallationManager>>, + manager: std::rc::Rc< + std::cell::RefCell<dyn crate::installer::InstallationManagerInterface>, + >, ) { self.partial.set_installation_manager(manager); } pub fn get_installation_manager( &self, - ) -> std::rc::Rc<std::cell::RefCell<crate::installer::InstallationManager>> { + ) -> std::rc::Rc<std::cell::RefCell<dyn crate::installer::InstallationManagerInterface>> { self.partial.get_installation_manager() } pub fn set_event_dispatcher( &mut self, - dispatcher: std::rc::Rc<std::cell::RefCell<crate::event_dispatcher::EventDispatcher>>, + dispatcher: std::rc::Rc< + std::cell::RefCell<dyn crate::event_dispatcher::EventDispatcherInterface>, + >, ) { self.partial.set_event_dispatcher(dispatcher); } pub fn get_event_dispatcher( &self, - ) -> std::rc::Rc<std::cell::RefCell<crate::event_dispatcher::EventDispatcher>> { + ) -> std::rc::Rc<std::cell::RefCell<dyn crate::event_dispatcher::EventDispatcherInterface>> + { self.partial.get_event_dispatcher() } @@ -366,7 +383,7 @@ impl PartialOrFullComposer { pub fn set_repository_manager( &mut self, - manager: std::rc::Rc<std::cell::RefCell<crate::repository::RepositoryManager>>, + manager: std::rc::Rc<std::cell::RefCell<dyn crate::repository::RepositoryManagerInterface>>, ) { 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::cell::RefCell<crate::repository::RepositoryManager>> { + ) -> std::rc::Rc<std::cell::RefCell<dyn crate::repository::RepositoryManagerInterface>> { 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<std::cell::RefCell<crate::installer::InstallationManager>>, + manager: std::rc::Rc< + std::cell::RefCell<dyn crate::installer::InstallationManagerInterface>, + >, ) { 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::cell::RefCell<crate::installer::InstallationManager>> { + ) -> std::rc::Rc<std::cell::RefCell<dyn crate::installer::InstallationManagerInterface>> { 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<std::cell::RefCell<crate::event_dispatcher::EventDispatcher>>, + dispatcher: std::rc::Rc< + std::cell::RefCell<dyn crate::event_dispatcher::EventDispatcherInterface>, + >, ) { 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::cell::RefCell<crate::event_dispatcher::EventDispatcher>> { + ) -> std::rc::Rc<std::cell::RefCell<dyn crate::event_dispatcher::EventDispatcherInterface>> + { match self { Self::Full(full) => full.get_event_dispatcher(), Self::Partial(partial) => partial.get_event_dispatcher(), |
