From 91072f910e9dec7c61e668b80180671c143f941d Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 15 May 2026 20:10:15 +0900 Subject: feat(port): port MetapackageInstaller.php --- .../shirabe/src/installer/metapackage_installer.rs | 87 ++++++++++++++++++++++ 1 file changed, 87 insertions(+) (limited to 'crates/shirabe/src/installer') diff --git a/crates/shirabe/src/installer/metapackage_installer.rs b/crates/shirabe/src/installer/metapackage_installer.rs index cba990f..8be21e7 100644 --- a/crates/shirabe/src/installer/metapackage_installer.rs +++ b/crates/shirabe/src/installer/metapackage_installer.rs @@ -1 +1,88 @@ //! ref: composer/src/Composer/Installer/MetapackageInstaller.php + +use anyhow::Result; +use shirabe_php_shim::InvalidArgumentException; +use shirabe_external_packages::react::promise::promise_interface::PromiseInterface; +use crate::dependency_resolver::operation::install_operation::InstallOperation; +use crate::dependency_resolver::operation::uninstall_operation::UninstallOperation; +use crate::dependency_resolver::operation::update_operation::UpdateOperation; +use crate::installer::installer_interface::InstallerInterface; +use crate::io::io_interface::IOInterface; +use crate::package::package_interface::PackageInterface; +use crate::repository::installed_repository_interface::InstalledRepositoryInterface; + +#[derive(Debug)] +pub struct MetapackageInstaller { + io: Box, +} + +impl MetapackageInstaller { + pub fn new(io: Box) -> Self { + Self { io } + } +} + +impl InstallerInterface for MetapackageInstaller { + fn supports(&self, package_type: &str) -> bool { + package_type == "metapackage" + } + + fn is_installed(&self, repo: &dyn InstalledRepositoryInterface, package: &dyn PackageInterface) -> bool { + repo.has_package(package) + } + + fn download(&self, _package: &dyn PackageInterface, _prev_package: Option<&dyn PackageInterface>) -> Result>> { + Ok(Some(shirabe_external_packages::react::promise::resolve(None))) + } + + fn prepare(&self, _type: &str, _package: &dyn PackageInterface, _prev_package: Option<&dyn PackageInterface>) -> Result>> { + Ok(Some(shirabe_external_packages::react::promise::resolve(None))) + } + + fn cleanup(&self, _type: &str, _package: &dyn PackageInterface, _prev_package: Option<&dyn PackageInterface>) -> Result>> { + Ok(Some(shirabe_external_packages::react::promise::resolve(None))) + } + + fn install(&self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface) -> Result>> { + self.io.write_error(&format!(" - {}", InstallOperation::format(package, false)), true, IOInterface::NORMAL); + + repo.add_package(package.clone_box()); + + Ok(Some(shirabe_external_packages::react::promise::resolve(None))) + } + + fn update(&self, repo: &mut dyn InstalledRepositoryInterface, initial: &dyn PackageInterface, target: &dyn PackageInterface) -> Result>> { + if !repo.has_package(initial) { + return Err(InvalidArgumentException { + message: format!("Package is not installed: {}", initial), + code: 0, + }.into()); + } + + self.io.write_error(&format!(" - {}", UpdateOperation::format(initial, target, false)), true, IOInterface::NORMAL); + + repo.remove_package(initial); + repo.add_package(target.clone_box()); + + Ok(Some(shirabe_external_packages::react::promise::resolve(None))) + } + + fn uninstall(&self, repo: &mut dyn InstalledRepositoryInterface, package: &dyn PackageInterface) -> Result>> { + if !repo.has_package(package) { + return Err(InvalidArgumentException { + message: format!("Package is not installed: {}", package), + code: 0, + }.into()); + } + + self.io.write_error(&format!(" - {}", UninstallOperation::format(package, false)), true, IOInterface::NORMAL); + + repo.remove_package(package); + + Ok(Some(shirabe_external_packages::react::promise::resolve(None))) + } + + fn get_install_path(&self, _package: &dyn PackageInterface) -> Option { + None + } +} -- cgit v1.3.1