From 25fa6c6b079b100f1c3970662d06d63bd741c1f0 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 20 Jun 2026 03:08:31 +0900 Subject: refactor(package-discovery): extend BaseCommand as supertrait PHP's PackageDiscoveryTrait is mixed into classes extending BaseCommand and calls its methods directly. Model that with a supertrait bound so get_io, try_composer, require_composer, get_platform_requirement_filter and normalize_requirements come from BaseCommand instead of being redeclared and delegated per command. Propagate the Result returns at the call sites and drop the now-redundant per-command impls. Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/shirabe/src/command/init_command.rs | 31 +--------------------- .../shirabe/src/command/package_discovery_trait.rs | 28 +++++-------------- crates/shirabe/src/command/require_command.rs | 29 -------------------- 3 files changed, 7 insertions(+), 81 deletions(-) (limited to 'crates/shirabe/src') diff --git a/crates/shirabe/src/command/init_command.rs b/crates/shirabe/src/command/init_command.rs index f345d76..d7beaf8 100644 --- a/crates/shirabe/src/command/init_command.rs +++ b/crates/shirabe/src/command/init_command.rs @@ -65,35 +65,6 @@ impl PackageDiscoveryTrait for InitCommand { { &mut self.repository_sets } - - fn get_io(&self) -> std::rc::Rc> { - todo!() - } - - fn try_composer(&self) -> Option { - todo!() - } - - fn require_composer( - &self, - disable_plugins: Option, - disable_scripts: Option, - ) -> PartialComposerHandle { - todo!() - } - - fn get_platform_requirement_filter( - &self, - input: std::rc::Rc>, - ) -> std::rc::Rc< - dyn crate::filter::platform_requirement_filter::PlatformRequirementFilterInterface, - > { - todo!() - } - - fn normalize_requirements(&self, requires: Vec) -> Vec> { - todo!() - } } impl Default for InitCommand { @@ -152,7 +123,7 @@ impl Command for InitCommand { input: Rc>, output: Rc>, ) -> anyhow::Result { - let io = PackageDiscoveryTrait::get_io(self); + let io = self.get_io(); let allowlist: Vec = vec![ "name".to_string(), diff --git a/crates/shirabe/src/command/package_discovery_trait.rs b/crates/shirabe/src/command/package_discovery_trait.rs index e2ffa7c..c182645 100644 --- a/crates/shirabe/src/command/package_discovery_trait.rs +++ b/crates/shirabe/src/command/package_discovery_trait.rs @@ -15,6 +15,7 @@ use shirabe_php_shim::{ strpos, trim, }; +use crate::command::BaseCommand; use crate::composer::PartialComposerHandle; use crate::factory::Factory; use crate::filter::platform_requirement_filter::IgnoreAllPlatformRequirementFilter; @@ -33,7 +34,7 @@ use crate::repository::{RepositoryInterface, SearchResult}; use crate::util::Filesystem; /// @internal -pub trait PackageDiscoveryTrait { +pub trait PackageDiscoveryTrait: BaseCommand { // PHP: private $repos; private $repositorySets; // TODO(phase-b): trait fields require an associated state struct in Rust; expose via accessors fn get_repos_mut(&mut self) -> &mut Option; @@ -41,23 +42,6 @@ pub trait PackageDiscoveryTrait { &mut self, ) -> &mut IndexMap>>; - // PHP: trait dependencies (provided by BaseCommand) - fn get_io(&self) -> std::rc::Rc>; - fn try_composer(&self) -> Option; - fn require_composer( - &self, - disable_plugins: Option, - disable_scripts: Option, - ) -> PartialComposerHandle; - fn get_platform_requirement_filter( - &self, - input: std::rc::Rc>, - ) -> std::rc::Rc< - dyn crate::filter::platform_requirement_filter::PlatformRequirementFilterInterface, - >; - - fn normalize_requirements(&self, requires: Vec) -> Vec>; - fn get_repos(&mut self) -> crate::repository::RepositoryInterfaceHandle { if self.get_repos_mut().is_none() { // PHP: array_merge([new PlatformRepository], RepositoryFactory::defaultReposWithDefaultManager($this->getIO())) @@ -160,7 +144,7 @@ pub trait PackageDiscoveryTrait { fixed: bool, ) -> Result> { if !requires.is_empty() { - let requires_norm = self.normalize_requirements(requires.clone()); + let requires_norm = self.normalize_requirements(requires.clone())?; let mut result: Vec = vec![]; let io = self.get_io(); @@ -228,7 +212,7 @@ pub trait PackageDiscoveryTrait { let version_parser = VersionParser::new(); // Collect existing packages - let composer = self.try_composer(); + let composer = self.try_composer(None, None); let composer_ref = composer.as_ref().map(|c| c.borrow_partial()); let repository_manager = composer_ref .as_ref() @@ -491,7 +475,7 @@ pub trait PackageDiscoveryTrait { let platform_requirement_filter = if input.borrow().has_option("ignore-platform-reqs") && input.borrow().has_option("ignore-platform-req") { - self.get_platform_requirement_filter(input.clone()) + self.get_platform_requirement_filter(input.clone())? } else { PlatformRequirementFilterFactory::ignore_nothing() }; @@ -803,7 +787,7 @@ pub trait PackageDiscoveryTrait { }; let mut similar_packages: IndexMap = IndexMap::new(); - let composer_for_installed = self.require_composer(None, None); + let composer_for_installed = self.require_composer(None, None)?; let composer_for_installed = composer_for_installed.borrow_partial(); let repository_manager = composer_for_installed.get_repository_manager().clone(); let repository_manager = repository_manager.borrow(); diff --git a/crates/shirabe/src/command/require_command.rs b/crates/shirabe/src/command/require_command.rs index 3d8331b..a29f60d 100644 --- a/crates/shirabe/src/command/require_command.rs +++ b/crates/shirabe/src/command/require_command.rs @@ -107,35 +107,6 @@ impl PackageDiscoveryTrait for RequireCommand { ) -> &mut IndexMap>> { &mut self.repository_sets } - - fn get_io(&self) -> std::rc::Rc> { - todo!() - } - - fn try_composer(&self) -> Option { - todo!() - } - - fn require_composer( - &self, - disable_plugins: Option, - disable_scripts: Option, - ) -> PartialComposerHandle { - todo!() - } - - fn get_platform_requirement_filter( - &self, - input: std::rc::Rc>, - ) -> std::rc::Rc< - dyn crate::filter::platform_requirement_filter::PlatformRequirementFilterInterface, - > { - todo!() - } - - fn normalize_requirements(&self, requires: Vec) -> Vec> { - todo!() - } } impl Command for RequireCommand { -- cgit v1.3.1