aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-15 02:52:40 +0900
committernsfisis <nsfisis@gmail.com>2026-05-15 19:51:17 +0900
commitc26e72540ee442e0194897aa6105851215fcf512 (patch)
tree768c823d4a4d4719e8a3182bc2dd83e2c5bd33ce /crates/shirabe
parent25d8e47802b3f185022b5290dda0c7daca6dbdc7 (diff)
downloadphp-shirabe-c26e72540ee442e0194897aa6105851215fcf512.tar.gz
php-shirabe-c26e72540ee442e0194897aa6105851215fcf512.tar.zst
php-shirabe-c26e72540ee442e0194897aa6105851215fcf512.zip
feat(port): port ProjectInstaller.php
Diffstat (limited to 'crates/shirabe')
-rw-r--r--crates/shirabe/src/installer/project_installer.rs81
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())
+ }
+}