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/installer/library_installer.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'crates/shirabe/src/installer/library_installer.rs') diff --git a/crates/shirabe/src/installer/library_installer.rs b/crates/shirabe/src/installer/library_installer.rs index e2c6c0c..e1c3aec 100644 --- a/crates/shirabe/src/installer/library_installer.rs +++ b/crates/shirabe/src/installer/library_installer.rs @@ -8,7 +8,7 @@ use shirabe_php_shim::{ }; use crate::composer::PartialComposerWeakHandle; -use crate::downloader::DownloadManager; +use crate::downloader::DownloadManagerInterface; use crate::installer::BinaryInstaller; use crate::installer::BinaryPresenceInterface; use crate::installer::InstallerInterface; @@ -24,7 +24,8 @@ use crate::util::Silencer; pub struct LibraryInstaller { pub(crate) composer: PartialComposerWeakHandle, pub(crate) vendor_dir: String, - pub(crate) download_manager: Option>>, + pub(crate) download_manager: + Option>>, pub(crate) io: std::rc::Rc>, pub(crate) r#type: Option, pub(crate) filesystem: std::rc::Rc>, @@ -192,7 +193,9 @@ impl LibraryInstaller { self.vendor_dir = realpath(&self.vendor_dir).unwrap_or_default(); } - pub(crate) fn get_download_manager(&self) -> &std::rc::Rc> { + pub(crate) fn get_download_manager( + &self, + ) -> &std::rc::Rc> { // PHP: assert($this->downloadManager instanceof DownloadManager, new \LogicException(...)) assert!( self.download_manager.is_some(), -- cgit v1.3.1