aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/command
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-23 23:14:52 +0900
committernsfisis <nsfisis@gmail.com>2026-05-23 23:15:14 +0900
commitdbdecaf5a1c54a876b7ee0153d58dd39b1080f97 (patch)
treef13f2ced03c803dcbc42a5672458b3cb19ff0f30 /crates/shirabe/src/command
parentf5b987a00712211b7ce56300851182bda904e97b (diff)
downloadphp-shirabe-dbdecaf5a1c54a876b7ee0153d58dd39b1080f97.tar.gz
php-shirabe-dbdecaf5a1c54a876b7ee0153d58dd39b1080f97.tar.zst
php-shirabe-dbdecaf5a1c54a876b7ee0153d58dd39b1080f97.zip
refactor(semver): change ConstraintInterface to a closed enum
Replace the dyn ConstraintInterface trait objects with an AnyConstraint enum closing over its four implementors (Simple, Multi, MatchAll, MatchNone), mirroring the earlier Rule enum conversion. Rename constraint.rs to simple_constraint.rs to match the renamed Constraint type. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/command')
-rw-r--r--crates/shirabe/src/command/archive_command.rs10
-rw-r--r--crates/shirabe/src/command/base_dependency_command.rs10
-rw-r--r--crates/shirabe/src/command/check_platform_reqs_command.rs23
-rw-r--r--crates/shirabe/src/command/fund_command.rs7
-rw-r--r--crates/shirabe/src/command/package_discovery_trait.rs9
-rw-r--r--crates/shirabe/src/command/show_command.rs6
-rw-r--r--crates/shirabe/src/command/update_command.rs7
7 files changed, 34 insertions, 38 deletions
diff --git a/crates/shirabe/src/command/archive_command.rs b/crates/shirabe/src/command/archive_command.rs
index c88b47b..0813df6 100644
--- a/crates/shirabe/src/command/archive_command.rs
+++ b/crates/shirabe/src/command/archive_command.rs
@@ -305,11 +305,11 @@ impl ArchiveCommand {
);
repo_set.add_repository(Box::new(repo))?;
let parser = VersionParser::new();
- let constraint: Option<Box<dyn shirabe_semver::constraint::ConstraintInterface>> =
- match version.as_deref() {
- Some(v) => Some(parser.parse_constraints(v)?.clone_box()),
- None => None,
- };
+ let constraint: Option<shirabe_semver::constraint::AnyConstraint> = match version.as_deref()
+ {
+ Some(v) => Some(parser.parse_constraints(v)?.clone()),
+ None => None,
+ };
let packages = repo_set.find_packages(&package_name.to_lowercase(), constraint, 0);
let package = if packages.len() > 1 {
diff --git a/crates/shirabe/src/command/base_dependency_command.rs b/crates/shirabe/src/command/base_dependency_command.rs
index 498c589..f1ff863 100644
--- a/crates/shirabe/src/command/base_dependency_command.rs
+++ b/crates/shirabe/src/command/base_dependency_command.rs
@@ -6,8 +6,8 @@ use shirabe_external_packages::symfony::component::console::input::InputInterfac
use shirabe_external_packages::symfony::component::console::output::OutputInterface;
use shirabe_external_packages::symfony::console::formatter::OutputFormatter;
use shirabe_php_shim::{InvalidArgumentException, PhpMixed, UnexpectedValueException};
+use shirabe_semver::constraint::AnyConstraint;
use shirabe_semver::constraint::Bound;
-use shirabe_semver::constraint::ConstraintInterface;
use crate::command::{BaseCommand, BaseCommandData, HasBaseCommandData};
use crate::package::CompletePackageInterface;
@@ -225,13 +225,9 @@ pub trait BaseDependencyCommand: BaseCommand {
}
let has_constraint = text_constraint != "*";
- let constraint: Option<Box<dyn ConstraintInterface>> = if has_constraint {
+ let constraint: Option<AnyConstraint> = if has_constraint {
let version_parser = VersionParser::new();
- Some(
- version_parser
- .parse_constraints(&text_constraint)?
- .clone_box(),
- )
+ Some(version_parser.parse_constraints(&text_constraint)?.clone())
} else {
None
};
diff --git a/crates/shirabe/src/command/check_platform_reqs_command.rs b/crates/shirabe/src/command/check_platform_reqs_command.rs
index 83770be..74ecfc3 100644
--- a/crates/shirabe/src/command/check_platform_reqs_command.rs
+++ b/crates/shirabe/src/command/check_platform_reqs_command.rs
@@ -5,8 +5,8 @@ use indexmap::IndexMap;
use shirabe_external_packages::symfony::component::console::input::InputInterface;
use shirabe_external_packages::symfony::component::console::output::OutputInterface;
use shirabe_php_shim::{PhpMixed, strip_tags};
-use shirabe_semver::constraint::Constraint;
-use shirabe_semver::constraint::ConstraintInterface;
+use shirabe_semver::constraint::AnyConstraint;
+use shirabe_semver::constraint::SimpleConstraint;
use crate::command::{BaseCommand, BaseCommandData, HasBaseCommandData};
use crate::console::input::InputOption;
@@ -147,22 +147,23 @@ impl CheckPlatformReqsCommand {
if !candidates.is_empty() {
let mut req_results: Vec<CheckResult> = vec![];
'candidates: for candidate in &candidates {
- let candidate_constraint: Option<Box<dyn ConstraintInterface>> =
+ let candidate_constraint: Option<AnyConstraint> =
if candidate.get_name() == require {
- let mut c = Constraint::new("=", candidate.get_version());
- c.set_pretty_string(Some(
- candidate.get_pretty_version().to_string(),
- ));
- Some(Box::new(c))
+ let c = SimpleConstraint::new(
+ "=".to_string(),
+ candidate.get_version().to_string(),
+ Some(candidate.get_pretty_version().to_string()),
+ );
+ Some(c.into())
} else {
- let mut found: Option<Box<dyn ConstraintInterface>> = None;
+ let mut found: Option<AnyConstraint> = None;
for (_, link) in candidate
.get_provides()
.iter()
.chain(candidate.get_replaces().iter())
{
if link.get_target() == require {
- found = Some(link.get_constraint().clone_box());
+ found = Some(link.get_constraint().clone());
break;
}
}
@@ -175,7 +176,7 @@ impl CheckPlatformReqsCommand {
};
for link in links {
- if !link.get_constraint().matches(&*candidate_constraint) {
+ if !link.get_constraint().matches(&candidate_constraint) {
req_results.push(CheckResult {
platform_package: if candidate.get_name() == require {
candidate.get_pretty_name().to_string()
diff --git a/crates/shirabe/src/command/fund_command.rs b/crates/shirabe/src/command/fund_command.rs
index 233eeaa..82c0c0a 100644
--- a/crates/shirabe/src/command/fund_command.rs
+++ b/crates/shirabe/src/command/fund_command.rs
@@ -9,7 +9,7 @@ use shirabe_external_packages::symfony::component::console::input::InputInterfac
use shirabe_external_packages::symfony::component::console::output::OutputInterface;
use shirabe_external_packages::symfony::console::formatter::OutputFormatter;
use shirabe_php_shim::PhpMixed;
-use shirabe_semver::constraint::ConstraintInterface;
+use shirabe_semver::constraint::AnyConstraint;
use shirabe_semver::constraint::MatchAllConstraint;
use crate::command::{BaseCommand, BaseCommandData, HasBaseCommandData};
@@ -64,8 +64,7 @@ impl FundCommand {
);
let mut fundings: IndexMap<String, IndexMap<String, Vec<String>>> = IndexMap::new();
- let mut packages_to_load: IndexMap<String, Option<Box<dyn ConstraintInterface>>> =
- IndexMap::new();
+ let mut packages_to_load: IndexMap<String, Option<AnyConstraint>> = IndexMap::new();
let mut packages_to_load_names: indexmap::IndexSet<String> = indexmap::IndexSet::new();
for package in repo.get_packages() {
if package.as_any().downcast_ref::<AliasPackage>().is_some() {
@@ -73,7 +72,7 @@ impl FundCommand {
}
packages_to_load.insert(
package.get_name().to_string(),
- Some(Box::new(MatchAllConstraint::new())),
+ Some(MatchAllConstraint::new(None).into()),
);
packages_to_load_names.insert(package.get_name().to_string());
}
diff --git a/crates/shirabe/src/command/package_discovery_trait.rs b/crates/shirabe/src/command/package_discovery_trait.rs
index 43d6ee8..fa25fa3 100644
--- a/crates/shirabe/src/command/package_discovery_trait.rs
+++ b/crates/shirabe/src/command/package_discovery_trait.rs
@@ -880,9 +880,12 @@ pub trait PackageDiscoveryTrait {
};
if !link
.get_constraint()
- .matches(&shirabe_semver::constraint::Constraint::new(
- "==",
- platform_pkg.get_version(),
+ .matches(&shirabe_semver::constraint::AnyConstraint::Simple(
+ shirabe_semver::constraint::SimpleConstraint::new(
+ "==".to_string(),
+ platform_pkg.get_version().to_string(),
+ None,
+ ),
))
{
let mut platform_pkg_version = platform_pkg.get_pretty_version().to_string();
diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs
index 3eac2df..8826421 100644
--- a/crates/shirabe/src/command/show_command.rs
+++ b/crates/shirabe/src/command/show_command.rs
@@ -13,7 +13,7 @@ use shirabe_php_shim::{
date, extension_loaded, in_array, realpath, strtolower, version_compare,
};
-use shirabe_semver::constraint::ConstraintInterface;
+use shirabe_semver::constraint::AnyConstraint;
use crate::command::{BaseCommand, BaseCommandData, HasBaseCommandData};
use crate::composer::PartialComposerHandle;
@@ -1486,7 +1486,7 @@ impl ShowCommand {
IndexMap<String, String>,
)> {
let name = strtolower(name);
- let constraint: Option<Box<dyn ConstraintInterface>> = match &version {
+ let constraint: Option<AnyConstraint> = match &version {
PhpMixed::String(s) => Some(self.version_parser.parse_constraints(s)?),
PhpMixed::Null => None,
_ => None, // already a ConstraintInterface
@@ -1514,7 +1514,7 @@ impl ShowCommand {
} else {
repository_set.create_pool_for_package(&name, None)?
};
- let matches = pool.what_provides(&name, constraint.as_deref());
+ let matches = pool.what_provides(&name, constraint.as_ref());
let mut literals: Vec<i64> = Vec::new();
for package in matches.iter() {
// avoid showing the 9999999-dev alias if the default branch has no branch-alias set
diff --git a/crates/shirabe/src/command/update_command.rs b/crates/shirabe/src/command/update_command.rs
index c4ae890..4096272 100644
--- a/crates/shirabe/src/command/update_command.rs
+++ b/crates/shirabe/src/command/update_command.rs
@@ -178,9 +178,7 @@ impl UpdateCommand {
for (package, constraint) in &reqs {
let package = strtolower(package);
let parsed_constraint = parser.parse_constraints(constraint)?;
- // TODO(phase-b): clone_box because Box<dyn ConstraintInterface> isn't Clone.
- temporary_constraints.insert(package.clone(), parsed_constraint.clone_box());
- let _ = parsed_constraint;
+ temporary_constraints.insert(package.clone(), parsed_constraint);
// TODO(phase-b): access root_requirements[package].getConstraint()
let intersected: bool = todo!("Intervals::haveIntersections check");
if let Some(_root_req) = todo!("root_requirements.get(&package)") as Option<PhpMixed> {
@@ -234,10 +232,9 @@ impl UpdateCommand {
matches.get(1).cloned().unwrap_or_default()
))?;
if temporary_constraints.contains_key(package.get_name()) {
- // TODO(phase-b): Box<dyn ConstraintInterface> isn't Clone; clone_box workaround.
let existing = temporary_constraints
.get(package.get_name())
- .map(|c| c.clone_box())
+ .map(|c| c.clone())
.unwrap();
temporary_constraints.insert(
package.get_name().to_string(),