aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package/root_alias_package.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/root_alias_package.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/root_alias_package.rs')
-rw-r--r--crates/shirabe/src/package/root_alias_package.rs285
1 files changed, 68 insertions, 217 deletions
diff --git a/crates/shirabe/src/package/root_alias_package.rs b/crates/shirabe/src/package/root_alias_package.rs
index d6dafa9..7298c1f 100644
--- a/crates/shirabe/src/package/root_alias_package.rs
+++ b/crates/shirabe/src/package/root_alias_package.rs
@@ -1,51 +1,77 @@
//! ref: composer/src/Composer/Package/RootAliasPackage.php
-use chrono::{DateTime, Utc};
use indexmap::IndexMap;
use shirabe_php_shim::PhpMixed;
use crate::package::CompleteAliasPackage;
+use crate::package::CompletePackageHandle;
use crate::package::CompletePackageInterface;
use crate::package::Link;
-use crate::package::PackageInterface;
-use crate::package::RootPackage;
+use crate::package::RootPackageHandle;
use crate::package::RootPackageInterface;
-use crate::repository::RepositoryInterface;
+use crate::package::handle::delegate_package_interface_to_inner;
#[derive(Debug)]
pub struct RootAliasPackage {
inner: CompleteAliasPackage,
// overrides CompleteAliasPackage::alias_of with the more specific RootPackage type
- pub(crate) alias_of: RootPackage,
+ pub(crate) alias_of: RootPackageHandle,
}
impl RootAliasPackage {
- pub fn new(alias_of: RootPackage, version: String, pretty_version: String) -> Self {
- // TODO(phase-b): RootPackage.inner (CompletePackage) is not accessible here
- let inner: CompleteAliasPackage = todo!();
+ pub fn new(alias_of: RootPackageHandle, version: String, pretty_version: String) -> Self {
+ let inner = CompleteAliasPackage::new(
+ CompletePackageHandle::from(alias_of.clone()),
+ version,
+ pretty_version,
+ );
Self { inner, alias_of }
}
- pub fn get_alias_of(&self) -> &RootPackage {
- &self.alias_of
+ pub fn get_alias_of(&self) -> RootPackageHandle {
+ self.alias_of.clone()
+ }
+
+ pub fn set_root_package_alias(&mut self, value: bool) {
+ self.inner.set_root_package_alias(value);
+ }
+
+ pub fn is_root_package_alias(&self) -> bool {
+ self.inner.is_root_package_alias()
+ }
+
+ pub fn has_self_version_requires(&self) -> bool {
+ self.inner.has_self_version_requires()
+ }
+}
+
+delegate_package_interface_to_inner!(RootAliasPackage, inner);
+
+impl std::fmt::Display for RootAliasPackage {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Display::fmt(&self.inner, f)
}
}
impl RootPackageInterface for RootAliasPackage {
fn get_aliases(&self) -> &[IndexMap<String, String>] {
- self.alias_of.get_aliases()
+ todo!("RootAliasPackage::get_aliases cannot return a borrow across the aliasOf handle")
}
fn get_minimum_stability(&self) -> &str {
- self.alias_of.get_minimum_stability()
+ todo!(
+ "RootAliasPackage::get_minimum_stability cannot return &str across the aliasOf handle"
+ )
}
fn get_stability_flags(&self) -> &IndexMap<String, i64> {
- self.alias_of.get_stability_flags()
+ todo!(
+ "RootAliasPackage::get_stability_flags cannot return a borrow across the aliasOf handle"
+ )
}
fn get_references(&self) -> &IndexMap<String, String> {
- self.alias_of.get_references()
+ todo!("RootAliasPackage::get_references cannot return a borrow across the aliasOf handle")
}
fn get_prefer_stable(&self) -> bool {
@@ -53,31 +79,28 @@ impl RootPackageInterface for RootAliasPackage {
}
fn get_config(&self) -> &IndexMap<String, PhpMixed> {
- self.alias_of.get_config()
+ todo!("RootAliasPackage::get_config cannot return a borrow across the aliasOf handle")
}
fn set_requires(&mut self, requires: Vec<Link>) {
- // TODO(phase-b): self.inner.requires = self.replace_self_version_dependencies(requires.clone(), Link::TYPE_REQUIRE)
+ // TODO(phase-c): PHP re-derives the local links via
+ // replaceSelfVersionDependencies before forwarding to aliasOf.
self.alias_of.set_requires(requires);
}
fn set_dev_requires(&mut self, dev_requires: Vec<Link>) {
- // TODO(phase-b): self.inner.dev_requires = self.replace_self_version_dependencies(dev_requires.clone(), Link::TYPE_DEV_REQUIRE)
self.alias_of.set_dev_requires(dev_requires);
}
fn set_conflicts(&mut self, conflicts: Vec<Link>) {
- // TODO(phase-b): self.inner.conflicts = self.replace_self_version_dependencies(conflicts.clone(), Link::TYPE_CONFLICT)
self.alias_of.set_conflicts(conflicts);
}
fn set_provides(&mut self, provides: Vec<Link>) {
- // TODO(phase-b): self.inner.provides = self.replace_self_version_dependencies(provides.clone(), Link::TYPE_PROVIDE)
self.alias_of.set_provides(provides);
}
fn set_replaces(&mut self, replaces: Vec<Link>) {
- // TODO(phase-b): self.inner.replaces = self.replace_self_version_dependencies(replaces.clone(), Link::TYPE_REPLACE)
self.alias_of.set_replaces(replaces);
}
@@ -124,274 +147,102 @@ impl RootPackageInterface for RootAliasPackage {
impl CompletePackageInterface for RootAliasPackage {
fn get_scripts(&self) -> IndexMap<String, Vec<String>> {
- todo!()
+ self.inner.get_scripts()
}
fn set_scripts(&mut self, scripts: IndexMap<String, Vec<String>>) {
- todo!()
+ self.inner.set_scripts(scripts);
}
fn get_repositories(&self) -> Vec<IndexMap<String, PhpMixed>> {
- todo!()
+ self.inner.get_repositories()
}
fn set_repositories(&mut self, repositories: Vec<IndexMap<String, PhpMixed>>) {
- todo!()
+ self.inner.set_repositories(repositories);
}
fn get_license(&self) -> Vec<String> {
- todo!()
+ self.inner.get_license()
}
fn set_license(&mut self, license: Vec<String>) {
- todo!()
+ self.inner.set_license(license);
}
fn get_keywords(&self) -> Vec<String> {
- todo!()
+ self.inner.get_keywords()
}
fn set_keywords(&mut self, keywords: Vec<String>) {
- todo!()
+ self.inner.set_keywords(keywords);
}
fn get_description(&self) -> Option<&str> {
- todo!()
+ self.inner.get_description()
}
fn set_description(&mut self, description: String) {
- todo!()
+ self.inner.set_description(description);
}
fn get_homepage(&self) -> Option<&str> {
- todo!()
+ self.inner.get_homepage()
}
fn set_homepage(&mut self, homepage: String) {
- todo!()
+ self.inner.set_homepage(homepage);
}
fn get_authors(&self) -> Vec<IndexMap<String, String>> {
- todo!()
+ self.inner.get_authors()
}
fn set_authors(&mut self, authors: Vec<IndexMap<String, String>>) {
- todo!()
+ self.inner.set_authors(authors);
}
fn get_support(&self) -> IndexMap<String, String> {
- todo!()
+ self.inner.get_support()
}
fn set_support(&mut self, support: IndexMap<String, String>) {
- todo!()
+ self.inner.set_support(support);
}
fn get_funding(&self) -> Vec<IndexMap<String, PhpMixed>> {
- todo!()
+ self.inner.get_funding()
}
fn set_funding(&mut self, funding: Vec<IndexMap<String, PhpMixed>>) {
- todo!()
+ self.inner.set_funding(funding);
}
fn is_abandoned(&self) -> bool {
- todo!()
+ self.inner.is_abandoned()
}
fn get_replacement_package(&self) -> Option<&str> {
- todo!()
+ self.inner.get_replacement_package()
}
fn set_abandoned(&mut self, abandoned: PhpMixed) {
- todo!()
+ self.inner.set_abandoned(abandoned);
}
fn get_archive_name(&self) -> Option<&str> {
- todo!()
+ self.inner.get_archive_name()
}
fn set_archive_name(&mut self, name: String) {
- todo!()
+ self.inner.set_archive_name(name);
}
fn get_archive_excludes(&self) -> Vec<String> {
- todo!()
+ self.inner.get_archive_excludes()
}
fn set_archive_excludes(&mut self, excludes: Vec<String>) {
- todo!()
- }
-}
-
-impl std::fmt::Display for RootAliasPackage {
- fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- todo!()
- }
-}
-
-impl PackageInterface for RootAliasPackage {
- fn as_any(&self) -> &dyn std::any::Any {
- self
- }
-
- fn get_name(&self) -> &str {
- todo!()
- }
- fn get_pretty_name(&self) -> &str {
- todo!()
- }
- fn get_names(&self, _provides: bool) -> Vec<String> {
- todo!()
- }
- fn set_id(&mut self, _id: i64) {
- todo!()
- }
- fn get_id(&self) -> i64 {
- todo!()
- }
- fn is_dev(&self) -> bool {
- todo!()
- }
- fn get_type(&self) -> &str {
- todo!()
- }
- fn get_target_dir(&self) -> Option<&str> {
- todo!()
- }
- fn get_extra(&self) -> IndexMap<String, PhpMixed> {
- todo!()
- }
- fn set_installation_source(&mut self, _type: Option<String>) {
- todo!()
- }
- fn get_installation_source(&self) -> Option<&str> {
- todo!()
- }
- fn get_source_type(&self) -> Option<&str> {
- todo!()
- }
- fn get_source_url(&self) -> Option<&str> {
- todo!()
- }
- fn get_source_urls(&self) -> Vec<String> {
- todo!()
- }
- fn get_source_reference(&self) -> Option<&str> {
- todo!()
- }
- fn get_source_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> {
- todo!()
- }
- fn set_source_mirrors(&mut self, _mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) {
- todo!()
- }
- fn get_dist_type(&self) -> Option<&str> {
- todo!()
- }
- fn get_dist_url(&self) -> Option<&str> {
- todo!()
- }
- fn get_dist_urls(&self) -> Vec<String> {
- todo!()
- }
- fn get_dist_reference(&self) -> Option<&str> {
- todo!()
- }
- fn get_dist_sha1_checksum(&self) -> Option<&str> {
- todo!()
- }
- fn get_dist_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> {
- todo!()
- }
- fn set_dist_mirrors(&mut self, _mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) {
- todo!()
- }
- fn get_version(&self) -> &str {
- todo!()
- }
- fn get_pretty_version(&self) -> &str {
- todo!()
- }
- fn get_full_pretty_version(&self, _truncate: bool, _display_mode: i64) -> String {
- todo!()
- }
- fn get_release_date(&self) -> Option<DateTime<Utc>> {
- todo!()
- }
- fn get_stability(&self) -> &str {
- todo!()
- }
- fn get_requires(&self) -> IndexMap<String, Link> {
- todo!()
- }
- fn get_conflicts(&self) -> IndexMap<String, Link> {
- todo!()
- }
- fn get_provides(&self) -> IndexMap<String, Link> {
- todo!()
- }
- fn get_replaces(&self) -> IndexMap<String, Link> {
- todo!()
- }
- fn get_dev_requires(&self) -> IndexMap<String, Link> {
- todo!()
- }
- fn get_suggests(&self) -> IndexMap<String, String> {
- todo!()
- }
- fn get_autoload(&self) -> IndexMap<String, PhpMixed> {
- todo!()
- }
- fn get_dev_autoload(&self) -> IndexMap<String, PhpMixed> {
- todo!()
- }
- fn get_include_paths(&self) -> Vec<String> {
- todo!()
- }
- fn get_php_ext(&self) -> Option<IndexMap<String, PhpMixed>> {
- todo!()
- }
- fn set_repository(&mut self, _repository: Box<dyn RepositoryInterface>) -> anyhow::Result<()> {
- todo!()
- }
- fn get_repository(&self) -> Option<&dyn RepositoryInterface> {
- todo!()
- }
- fn get_binaries(&self) -> Vec<String> {
- todo!()
- }
- fn get_unique_name(&self) -> String {
- todo!()
- }
- fn get_notification_url(&self) -> Option<&str> {
- todo!()
- }
- fn get_pretty_string(&self) -> String {
- todo!()
- }
- fn is_default_branch(&self) -> bool {
- todo!()
- }
- fn get_transport_options(&self) -> IndexMap<String, PhpMixed> {
- todo!()
- }
- fn set_transport_options(&mut self, _options: IndexMap<String, PhpMixed>) {
- todo!()
- }
- fn set_source_reference(&mut self, _reference: Option<String>) {
- todo!()
- }
- fn set_dist_url(&mut self, _url: Option<String>) {
- todo!()
- }
- fn set_dist_type(&mut self, _type: Option<String>) {
- todo!()
- }
- fn set_dist_reference(&mut self, _reference: Option<String>) {
- todo!()
- }
- fn set_source_dist_references(&mut self, _reference: &str) {
- todo!()
+ self.inner.set_archive_excludes(excludes);
}
}