diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-15 00:27:35 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-15 02:37:37 +0900 |
| commit | f7fea071d4dcbda70adea9c871ad4226193b32cf (patch) | |
| tree | 26efc5185b4f95651145b9c4521afa36b74cbaa8 /crates/shirabe/src/command/suggests_command.rs | |
| parent | ac46dc8e98629719370c98e0a4760f7cd6b25578 (diff) | |
| download | php-shirabe-f7fea071d4dcbda70adea9c871ad4226193b32cf.tar.gz php-shirabe-f7fea071d4dcbda70adea9c871ad4226193b32cf.tar.zst php-shirabe-f7fea071d4dcbda70adea9c871ad4226193b32cf.zip | |
feat(port): port SuggestsCommand.php
Add in_array shim function.
Diffstat (limited to 'crates/shirabe/src/command/suggests_command.rs')
| -rw-r--r-- | crates/shirabe/src/command/suggests_command.rs | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/crates/shirabe/src/command/suggests_command.rs b/crates/shirabe/src/command/suggests_command.rs index a0adac6..5f0fa59 100644 --- a/crates/shirabe/src/command/suggests_command.rs +++ b/crates/shirabe/src/command/suggests_command.rs @@ -1 +1,94 @@ //! ref: composer/src/Composer/Command/SuggestsCommand.php + +use anyhow::Result; +use crate::command::base_command::BaseCommand; +use crate::command::completion_trait::CompletionTrait; +use crate::console::input::input_argument::InputArgument; +use crate::console::input::input_option::InputOption; +use crate::installer::suggested_packages_reporter::SuggestedPackagesReporter; +use crate::repository::installed_repository::InstalledRepository; +use crate::repository::platform_repository::PlatformRepository; +use crate::repository::root_package_repository::RootPackageRepository; +use shirabe_external_packages::symfony::console::input::input_interface::InputInterface; +use shirabe_external_packages::symfony::console::output::output_interface::OutputInterface; +use shirabe_php_shim::{empty, in_array, PhpMixed}; + +#[derive(Debug)] +pub struct SuggestsCommand { + inner: BaseCommand, + completion_trait: CompletionTrait, +} + +impl SuggestsCommand { + pub fn configure(&mut self) { + let suggest_installed_package = self.completion_trait.suggest_installed_package(); + self.inner + .set_name("suggests") + .set_description("Shows package suggestions") + .set_definition(vec![ + InputOption::new("by-package", None, Some(InputOption::VALUE_NONE), "Groups output by suggesting package (default)", None, vec![]), + InputOption::new("by-suggestion", None, Some(InputOption::VALUE_NONE), "Groups output by suggested package", None, vec![]), + InputOption::new("all", Some(PhpMixed::String("a".to_string())), Some(InputOption::VALUE_NONE), "Show suggestions from all dependencies, including transitive ones", None, vec![]), + InputOption::new("list", None, Some(InputOption::VALUE_NONE), "Show only list of suggested package names", None, vec![]), + InputOption::new("no-dev", None, Some(InputOption::VALUE_NONE), "Exclude suggestions from require-dev packages", None, vec![]), + InputArgument::new("packages", Some(InputArgument::IS_ARRAY | InputArgument::OPTIONAL), "Packages that you want to list suggestions from.", None, suggest_installed_package), + ]) + .set_help( + "\nThe <info>%command.name%</info> command shows a sorted list of suggested packages.\n\nRead more at https://getcomposer.org/doc/03-cli.md#suggests", + ); + } + + pub fn execute(&mut self, input: &dyn InputInterface, _output: &dyn OutputInterface) -> Result<i64> { + let composer = self.inner.require_composer()?; + + let mut installed_repos = vec![ + Box::new(RootPackageRepository::new(composer.get_package().clone())), + ]; + + let locker = composer.get_locker(); + if locker.is_locked() { + installed_repos.push(Box::new(PlatformRepository::new(vec![], locker.get_platform_overrides()))); + installed_repos.push(Box::new(locker.get_locked_repository(!input.get_option("no-dev").as_bool().unwrap_or(false)))); + } else { + installed_repos.push(Box::new(PlatformRepository::new(vec![], composer.get_config().get("platform")))); + installed_repos.push(Box::new(composer.get_repository_manager().get_local_repository())); + } + + let installed_repo = InstalledRepository::new(installed_repos); + let mut reporter = SuggestedPackagesReporter::new(self.inner.get_io()); + + let filter = input.get_argument("packages"); + let mut packages = installed_repo.get_packages(); + packages.push(composer.get_package()); + for package in &packages { + if !empty(&filter) && !in_array(PhpMixed::String(package.get_name().to_string()), &filter, false) { + continue; + } + reporter.add_suggestions_from_package(package); + } + + let mut mode = SuggestedPackagesReporter::MODE_BY_PACKAGE; + + if input.get_option("by-suggestion").as_bool().unwrap_or(false) { + mode = SuggestedPackagesReporter::MODE_BY_SUGGESTION; + } + if input.get_option("by-package").as_bool().unwrap_or(false) { + mode |= SuggestedPackagesReporter::MODE_BY_PACKAGE; + } + if input.get_option("list").as_bool().unwrap_or(false) { + mode = SuggestedPackagesReporter::MODE_LIST; + } + + reporter.output( + mode, + &installed_repo, + if empty(&filter) && !input.get_option("all").as_bool().unwrap_or(false) { + Some(composer.get_package()) + } else { + None + }, + ); + + Ok(0) + } +} |
