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/package/archiver/archive_manager.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/package/archiver/archive_manager.rs')
| -rw-r--r-- | crates/shirabe/src/package/archiver/archive_manager.rs | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/crates/shirabe/src/package/archiver/archive_manager.rs b/crates/shirabe/src/package/archiver/archive_manager.rs index 139eb9a..be911d6 100644 --- a/crates/shirabe/src/package/archiver/archive_manager.rs +++ b/crates/shirabe/src/package/archiver/archive_manager.rs @@ -49,9 +49,8 @@ impl ArchiveManager { self.archivers.push(archiver); } - pub fn set_overwrite_files(&mut self, overwrite_files: bool) -> &mut Self { + pub fn set_overwrite_files(&mut self, overwrite_files: bool) { self.overwrite_files = overwrite_files; - self } pub fn get_package_filename_parts( @@ -314,3 +313,29 @@ impl ArchiveManager { formats } } + +// Composer's Composer::setArchiveManager() accepts any ArchiveManager subclass, so plugins may +// swap in a replacement. The interface captures the methods reached through Composer's accessor. +pub trait ArchiveManagerInterface: std::fmt::Debug { + fn archive( + &mut self, + package: CompletePackageInterfaceHandle, + format: String, + target_dir: String, + file_name: Option<String>, + ignore_filters: bool, + ) -> anyhow::Result<String>; +} + +impl ArchiveManagerInterface for ArchiveManager { + fn archive( + &mut self, + package: CompletePackageInterfaceHandle, + format: String, + target_dir: String, + file_name: Option<String>, + ignore_filters: bool, + ) -> anyhow::Result<String> { + self.archive(package, format, target_dir, file_name, ignore_filters) + } +} |
