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/tests/composer_test.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'crates/shirabe/tests/composer_test.rs') diff --git a/crates/shirabe/tests/composer_test.rs b/crates/shirabe/tests/composer_test.rs index 908e813..bffe4ce 100644 --- a/crates/shirabe/tests/composer_test.rs +++ b/crates/shirabe/tests/composer_test.rs @@ -7,12 +7,15 @@ use indexmap::IndexMap; use shirabe::composer::Composer; use shirabe::config::Config; use shirabe::downloader::DownloadManager; +use shirabe::downloader::DownloadManagerInterface; use shirabe::installer::InstallationManager; +use shirabe::installer::InstallationManagerInterface; use shirabe::io::IOInterface; use shirabe::io::null_io::NullIO; use shirabe::json::JsonFile; -use shirabe::package::{Locker, RootPackageHandle, RootPackageInterfaceHandle}; +use shirabe::package::{Locker, LockerInterface, RootPackageHandle, RootPackageInterfaceHandle}; use shirabe::repository::RepositoryManager; +use shirabe::repository::RepositoryManagerInterface; use shirabe::util::http_downloader::HttpDownloader; use shirabe::util::r#loop::Loop; use shirabe::util::process_executor::ProcessExecutor; @@ -60,7 +63,7 @@ fn test_set_get_locker() { let io = null_io(); let json_file = JsonFile::new("composer.lock".to_string(), None, None).unwrap(); let process = Rc::new(RefCell::new(ProcessExecutor::new(Some(io.clone())))); - let locker = Rc::new(RefCell::new(Locker::new( + let locker: Rc> = Rc::new(RefCell::new(Locker::new( io.clone(), json_file, installation_manager(&io), @@ -77,13 +80,9 @@ fn test_set_get_repository_manager() { let mut composer = Composer::new(); let io = null_io(); let config = Rc::new(RefCell::new(Config::new(false, None))); - let manager = Rc::new(RefCell::new(RepositoryManager::new( - io.clone(), - config, - http_downloader(&io), - None, - None, - ))); + let manager: Rc> = Rc::new(RefCell::new( + RepositoryManager::new(io.clone(), config, http_downloader(&io), None, None), + )); composer.set_repository_manager(manager.clone()); assert!(Rc::ptr_eq(&composer.get_repository_manager(), &manager)); @@ -92,7 +91,8 @@ fn test_set_get_repository_manager() { #[test] fn test_set_get_download_manager() { let mut composer = Composer::new(); - let manager = Rc::new(RefCell::new(DownloadManager::new(null_io(), false, None))); + let manager: Rc> = + Rc::new(RefCell::new(DownloadManager::new(null_io(), false, None))); composer.set_download_manager(manager.clone()); assert!(Rc::ptr_eq(&composer.get_download_manager(), &manager)); @@ -102,7 +102,7 @@ fn test_set_get_download_manager() { fn test_set_get_installation_manager() { let mut composer = Composer::new(); let io = null_io(); - let manager = installation_manager(&io); + let manager: Rc> = installation_manager(&io); composer.set_installation_manager(manager.clone()); assert!(Rc::ptr_eq(&composer.get_installation_manager(), &manager)); -- cgit v1.3.1