diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-15 02:52:40 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-15 19:51:17 +0900 |
| commit | c26e72540ee442e0194897aa6105851215fcf512 (patch) | |
| tree | 768c823d4a4d4719e8a3182bc2dd83e2c5bd33ce /crates/shirabe/src | |
| parent | 25d8e47802b3f185022b5290dda0c7daca6dbdc7 (diff) | |
| download | php-shirabe-c26e72540ee442e0194897aa6105851215fcf512.tar.gz php-shirabe-c26e72540ee442e0194897aa6105851215fcf512.tar.zst php-shirabe-c26e72540ee442e0194897aa6105851215fcf512.zip | |
feat(port): port ProjectInstaller.php
Diffstat (limited to 'crates/shirabe/src')
| -rw-r--r-- | crates/shirabe/src/installer/project_installer.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/crates/shirabe/src/installer/project_installer.rs b/crates/shirabe/src/installer/project_installer.rs index 36fe7aa..6472472 100644 --- a/crates/shirabe/src/installer/project_installer.rs +++ b/crates/shirabe/src/installer/project_installer.rs @@ -1 +1,82 @@ //! ref: composer/src/Composer/Installer/ProjectInstaller.php + +use shirabe_external_packages::react::promise::promise_interface::PromiseInterface; +use shirabe_php_shim::InvalidArgumentException; +use crate::downloader::download_manager::DownloadManager; +use crate::installer::installer_interface::InstallerInterface; +use crate::package::package_interface::PackageInterface; +use crate::repository::installed_repository_interface::InstalledRepositoryInterface; +use crate::util::filesystem::Filesystem; + +#[derive(Debug)] +pub struct ProjectInstaller { + install_path: String, + download_manager: DownloadManager, + filesystem: Filesystem, +} + +impl ProjectInstaller { + pub fn new(install_path: &str, dm: DownloadManager, fs: Filesystem) -> Self { + let install_path = format!("{}/", install_path.replace('\\', '/').trim_end_matches('/')); + Self { + install_path, + download_manager: dm, + filesystem: fs, + } + } +} + +impl InstallerInterface for ProjectInstaller { + fn supports(&self, _package_type: &str) -> bool { + true + } + + fn is_installed(&self, _repo: &dyn InstalledRepositoryInterface, _package: &dyn PackageInterface) -> bool { + false + } + + fn download(&self, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + let install_path = &self.install_path; + if std::path::Path::new(install_path).exists() && !self.filesystem.is_dir_empty(install_path) { + return Err(InvalidArgumentException { + message: format!("Project directory {} is not empty.", install_path), + code: 0, + }.into()); + } + if !std::path::Path::new(install_path).is_dir() { + std::fs::create_dir_all(install_path)?; + } + + self.download_manager.download(package, install_path, prev_package) + } + + fn prepare(&self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + self.download_manager.prepare(r#type, package, &self.install_path, prev_package) + } + + fn cleanup(&self, r#type: &str, package: &dyn PackageInterface, prev_package: Option<&dyn PackageInterface>) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + self.download_manager.cleanup(r#type, package, &self.install_path, prev_package) + } + + fn install(&self, _repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + self.download_manager.install(package, &self.install_path) + } + + fn update(&self, _repo: &mut dyn InstalledRepositoryInterface, _initial: &dyn PackageInterface, _target: &dyn PackageInterface) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + Err(InvalidArgumentException { + message: "not supported".to_string(), + code: 0, + }.into()) + } + + fn uninstall(&self, _repo: &mut dyn InstalledRepositoryInterface, _package: &dyn PackageInterface) -> anyhow::Result<Option<Box<dyn PromiseInterface>>> { + Err(InvalidArgumentException { + message: "not supported".to_string(), + code: 0, + }.into()) + } + + fn get_install_path(&self, _package: &dyn PackageInterface) -> Option<String> { + Some(self.install_path.clone()) + } +} |
