aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/command/fund_command.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-25 00:58:20 +0900
committernsfisis <nsfisis@gmail.com>2026-05-25 00:58:36 +0900
commit1921f173ea219cb4b25847294d2d3fa465550fbb (patch)
tree0d30486a2cb9a0c106e5d5827be3f655c60cd871 /crates/shirabe/src/command/fund_command.rs
parentdbdecaf5a1c54a876b7ee0153d58dd39b1080f97 (diff)
downloadphp-shirabe-1921f173ea219cb4b25847294d2d3fa465550fbb.tar.gz
php-shirabe-1921f173ea219cb4b25847294d2d3fa465550fbb.tar.zst
php-shirabe-1921f173ea219cb4b25847294d2d3fa465550fbb.zip
refactor(package): introduce Rc<RefCell<_>> handles for packages
PHP packages have reference semantics, so introduce shared-ownership handles over an AnyPackage enum (PackageInterfaceHandle and friends) and replace Box<dyn PackageInterface> throughout. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/command/fund_command.rs')
-rw-r--r--crates/shirabe/src/command/fund_command.rs29
1 files changed, 15 insertions, 14 deletions
diff --git a/crates/shirabe/src/command/fund_command.rs b/crates/shirabe/src/command/fund_command.rs
index 82c0c0a..f829342 100644
--- a/crates/shirabe/src/command/fund_command.rs
+++ b/crates/shirabe/src/command/fund_command.rs
@@ -67,14 +67,14 @@ impl FundCommand {
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() {
+ if package.as_alias().is_some() {
continue;
}
packages_to_load.insert(
- package.get_name().to_string(),
+ package.get_name(),
Some(MatchAllConstraint::new(None).into()),
);
- packages_to_load_names.insert(package.get_name().to_string());
+ packages_to_load_names.insert(package.get_name());
}
// load all packages dev versions in parallel
@@ -87,15 +87,15 @@ impl FundCommand {
// collect funding data from default branches
for (_, package) in &result.packages {
- if package.as_any().downcast_ref::<AliasPackage>().is_none() {
+ if package.as_alias().is_none() {
// TODO: check for CompleteAliasPackage as well
- if let Some(complete_pkg) = package.as_any().downcast_ref::<CompletePackage>() {
+ if let Some(complete_pkg) = package.as_complete() {
if complete_pkg.is_default_branch()
&& !complete_pkg.get_funding().is_empty()
- && packages_to_load_names.contains(complete_pkg.get_name())
+ && packages_to_load_names.contains(&complete_pkg.get_name())
{
- Self::insert_funding_data(&mut fundings, complete_pkg)?;
- packages_to_load_names.shift_remove(complete_pkg.get_name());
+ Self::insert_funding_data(&mut fundings, &complete_pkg)?;
+ packages_to_load_names.shift_remove(&complete_pkg.get_name());
}
}
}
@@ -103,15 +103,14 @@ impl FundCommand {
// collect funding from installed packages if none was found in the default branch above
for package in repo.get_packages() {
- if package.as_any().downcast_ref::<AliasPackage>().is_some()
- || !packages_to_load_names.contains(package.get_name())
+ if package.as_alias().is_some() || !packages_to_load_names.contains(&package.get_name())
{
continue;
}
// TODO: check for CompleteAliasPackage as well
- if let Some(complete_pkg) = package.as_any().downcast_ref::<CompletePackage>() {
+ if let Some(complete_pkg) = package.as_complete() {
if !complete_pkg.get_funding().is_empty() {
- Self::insert_funding_data(&mut fundings, complete_pkg)?;
+ Self::insert_funding_data(&mut fundings, &complete_pkg)?;
}
}
}
@@ -172,10 +171,12 @@ impl FundCommand {
fn insert_funding_data(
fundings: &mut IndexMap<String, IndexMap<String, Vec<String>>>,
- package: &CompletePackage,
+ package: &crate::package::CompletePackageInterfaceHandle,
) -> Result<()> {
let pretty_name = package.get_pretty_name();
- let (vendor, package_name) = pretty_name.split_once('/').unwrap_or(("", pretty_name));
+ let (vendor, package_name) = pretty_name
+ .split_once('/')
+ .unwrap_or(("", pretty_name.as_str()));
for funding_option in package.get_funding() {
let url_val = funding_option.get("url").and_then(|v| v.as_string());