aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package/loader/array_loader.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/package/loader/array_loader.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/package/loader/array_loader.rs')
-rw-r--r--crates/shirabe/src/package/loader/array_loader.rs23
1 files changed, 17 insertions, 6 deletions
diff --git a/crates/shirabe/src/package/loader/array_loader.rs b/crates/shirabe/src/package/loader/array_loader.rs
index 87d6e35..e1cc60b 100644
--- a/crates/shirabe/src/package/loader/array_loader.rs
+++ b/crates/shirabe/src/package/loader/array_loader.rs
@@ -12,11 +12,14 @@ use shirabe_php_shim::{
use crate::package::CompleteAliasPackage;
use crate::package::CompletePackage;
+use crate::package::CompletePackageHandle;
use crate::package::CompletePackageInterface;
use crate::package::Link;
use crate::package::PackageInterface;
+use crate::package::PackageInterfaceHandle;
use crate::package::RootAliasPackage;
use crate::package::RootPackage;
+use crate::package::RootPackageHandle;
use crate::package::loader::LoaderInterface;
use crate::package::version::VersionParser;
use crate::package::{BasePackage, SUPPORTED_LINK_TYPES};
@@ -51,7 +54,7 @@ impl LoaderInterface for ArrayLoader {
&self,
mut config: IndexMap<String, PhpMixed>,
class: Option<String>,
- ) -> Result<Box<dyn BasePackage>> {
+ ) -> Result<PackageInterfaceHandle> {
let class = class.unwrap_or_else(|| "Composer\\Package\\CompletePackage".to_string());
if class != "Composer\\Package\\CompletePackage"
@@ -104,8 +107,8 @@ impl ArrayLoader {
pub fn load_packages(
&self,
versions: Vec<IndexMap<String, PhpMixed>>,
- ) -> Result<Vec<Box<dyn BasePackage>>> {
- let mut packages: Vec<Box<dyn BasePackage>> = vec![];
+ ) -> Result<Vec<PackageInterfaceHandle>> {
+ let mut packages: Vec<PackageInterfaceHandle> = vec![];
let mut link_cache: IndexMap<
String,
IndexMap<String, IndexMap<String, IndexMap<String, (String, Link)>>>,
@@ -226,7 +229,7 @@ impl ArrayLoader {
&self,
mut package: Box<CompletePackage>,
config: &mut IndexMap<String, PhpMixed>,
- ) -> Result<Box<dyn BasePackage>> {
+ ) -> Result<PackageInterfaceHandle> {
// PHP: if (!$package instanceof CompletePackage) — true by construction in Rust
// (create_object always returns Box<CompletePackage>); kept as a no-op for parity.
let _ = LogicException {
@@ -593,12 +596,20 @@ impl ArrayLoader {
// TODO(phase-b): `$package instanceof RootPackage` downcast from CompletePackage
let package_as_root: Option<RootPackage> = None;
if let Some(root) = package_as_root {
- let _ = RootAliasPackage::new(root, alias_normalized, pretty_alias);
+ let _ = RootAliasPackage::new(
+ RootPackageHandle::from_root_package(root),
+ alias_normalized,
+ pretty_alias,
+ );
// TODO(phase-b): return Box<RootAliasPackage> wrapped as Box<BasePackage>
todo!("phase-b: return RootAliasPackage as Box<BasePackage>")
}
- let _ = CompleteAliasPackage::new(*package, alias_normalized, pretty_alias);
+ let _ = CompleteAliasPackage::new(
+ CompletePackageHandle::from_complete_package(*package),
+ alias_normalized,
+ pretty_alias,
+ );
// TODO(phase-b): return Box<CompleteAliasPackage> wrapped as Box<BasePackage>
todo!("phase-b: return CompleteAliasPackage as Box<BasePackage>")
}