diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-12 04:41:30 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-12 04:41:30 +0900 |
| commit | 09d910841772bc53960c71e3b4d1b43faba4e0f3 (patch) | |
| tree | 2d2cc9787f872ab0b16d5037191ec2b4d5021edf /crates | |
| parent | 55d44d86077e8512c15389f9b2f9c9157b4a3137 (diff) | |
| download | php-shirabe-09d910841772bc53960c71e3b4d1b43faba4e0f3.tar.gz php-shirabe-09d910841772bc53960c71e3b4d1b43faba4e0f3.tar.zst php-shirabe-09d910841772bc53960c71e3b4d1b43faba4e0f3.zip | |
feat(port): port SyncHelper.php
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/shirabe/src/util/sync_helper.rs | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/crates/shirabe/src/util/sync_helper.rs b/crates/shirabe/src/util/sync_helper.rs index b3e721b..c5ab889 100644 --- a/crates/shirabe/src/util/sync_helper.rs +++ b/crates/shirabe/src/util/sync_helper.rs @@ -1 +1,92 @@ //! ref: composer/src/Composer/Util/SyncHelper.php + +use anyhow::Result; +use shirabe_external_packages::react::promise::promise_interface::PromiseInterface; +use crate::downloader::download_manager::DownloadManager; +use crate::downloader::downloader_interface::DownloaderInterface; +use crate::package::package_interface::PackageInterface; +use crate::util::r#loop::Loop; + +pub enum DownloaderOrManager<'a> { + Interface(&'a dyn DownloaderInterface), + Manager(&'a DownloadManager), +} + +impl<'a> DownloaderOrManager<'a> { + fn download(&self, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>) -> Box<dyn PromiseInterface> { + match self { + Self::Interface(d) => d.download(package, path, prev_package), + Self::Manager(d) => d.download(package, path, prev_package), + } + } + + fn prepare(&self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>) -> Box<dyn PromiseInterface> { + match self { + Self::Interface(d) => d.prepare(r#type, package, path, prev_package), + Self::Manager(d) => d.prepare(r#type, package, path, prev_package), + } + } + + fn install(&self, package: &dyn PackageInterface, path: &str) -> Box<dyn PromiseInterface> { + match self { + Self::Interface(d) => d.install(package, path), + Self::Manager(d) => d.install(package, path), + } + } + + fn update(&self, package: &dyn PackageInterface, prev_package: &dyn PackageInterface, path: &str) -> Box<dyn PromiseInterface> { + match self { + Self::Interface(d) => d.update(package, prev_package, path), + Self::Manager(d) => d.update(package, prev_package, path), + } + } + + fn cleanup(&self, r#type: &str, package: &dyn PackageInterface, path: &str, prev_package: Option<&dyn PackageInterface>) -> Box<dyn PromiseInterface> { + match self { + Self::Interface(d) => d.cleanup(r#type, package, path, prev_package), + Self::Manager(d) => d.cleanup(r#type, package, path, prev_package), + } + } +} + +pub struct SyncHelper; + +impl SyncHelper { + pub fn download_and_install_package_sync( + r#loop: &Loop, + downloader: DownloaderOrManager<'_>, + path: String, + package: &dyn PackageInterface, + prev_package: Option<&dyn PackageInterface>, + ) -> Result<()> { + let r#type = if prev_package.is_some() { "update" } else { "install" }; + + let result: Result<()> = (|| { + Self::r#await(r#loop, Some(downloader.download(package, &path, prev_package)))?; + Self::r#await(r#loop, Some(downloader.prepare(r#type, package, &path, prev_package)))?; + if r#type == "update" { + if let Some(prev) = prev_package { + Self::r#await(r#loop, Some(downloader.update(package, prev, &path)))?; + } + } else { + Self::r#await(r#loop, Some(downloader.install(package, &path)))?; + } + Ok(()) + })(); + + if result.is_err() { + Self::r#await(r#loop, Some(downloader.cleanup(r#type, package, &path, prev_package)))?; + return result; + } + + Self::r#await(r#loop, Some(downloader.cleanup(r#type, package, &path, prev_package)))?; + Ok(()) + } + + pub fn r#await(r#loop: &Loop, promise: Option<Box<dyn PromiseInterface>>) -> Result<()> { + if let Some(promise) = promise { + r#loop.wait(vec![promise]); + } + Ok(()) + } +} |
