diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-04 21:09:02 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-04 21:09:02 +0900 |
| commit | 06e8e14520a4a38fed500581d2b75a42418b22c4 (patch) | |
| tree | 573af18bf6e0933488aea9c1bac47bf4e857546d /crates/shirabe/src | |
| parent | a9f19862350c6fd3592d93515d869ffe07ecb399 (diff) | |
| download | php-shirabe-06e8e14520a4a38fed500581d2b75a42418b22c4.tar.gz php-shirabe-06e8e14520a4a38fed500581d2b75a42418b22c4.tar.zst php-shirabe-06e8e14520a4a38fed500581d2b75a42418b22c4.zip | |
feat(package): implement PackageInterface accessor layer for Package/CompletePackage/RootPackage
Fill the trait-impl todo!() across the package accessor layer so loaded
packages are actually usable (the ArrayLoader::load path depends on it):
- Package: implement BasePackage/PackageInterface from struct fields and
existing inherent methods; Display via get_unique_name.
- CompletePackage: delegate PackageInterface to inner Package.
- RootPackage: delegate CompletePackageInterface/PackageInterface to inner
CompletePackage; RootPackageInterface link setters delegate to Package.
Correct three unfaithful trait signatures found during implementation:
- get_target_dir returns Option<String> (PHP computes a normalized value;
a borrow cannot represent it, and AliasPackage could not implement &str
across its aliasOf handle).
- RootPackageInterface link setters take IndexMap<String, Link>, matching
Package and the real ArrayLoader caller (PHP RootPackage inherits
Package::setRequires; the Link[] docblock was imprecise).
- get_full_pretty_version takes a DisplayMode enum instead of a raw i64;
the match is now exhaustive, so it returns String without an error path.
Move mirror conversion to the boundaries: PackageInterface mirror methods
use Vec<Mirror> (the typed form, matching the inherent methods), with
array<->Mirror conversion done by the producer (ComposerRepository) and
consumer (ArrayDumper).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src')
22 files changed, 443 insertions, 420 deletions
diff --git a/crates/shirabe/src/command/create_project_command.rs b/crates/shirabe/src/command/create_project_command.rs index efbfd44..1667ac1 100644 --- a/crates/shirabe/src/command/create_project_command.rs +++ b/crates/shirabe/src/command/create_project_command.rs @@ -895,10 +895,7 @@ impl CreateProjectCommand { io.write_error(&format!( "<info>Installing {} ({})</info>", package.get_name(), - package.get_full_pretty_version( - false, - <dyn crate::package::PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV - ) + package.get_full_pretty_version(false, crate::package::DisplayMode::SourceRefIfDev) )); if disable_plugins { diff --git a/crates/shirabe/src/command/licenses_command.rs b/crates/shirabe/src/command/licenses_command.rs index 681ac7a..ddd7d3d 100644 --- a/crates/shirabe/src/command/licenses_command.rs +++ b/crates/shirabe/src/command/licenses_command.rs @@ -19,7 +19,6 @@ use crate::json::JsonFile; use crate::package::BasePackage; use crate::package::CompletePackage; use crate::package::CompletePackageInterface; -use crate::package::PackageInterface; use crate::plugin::CommandEvent; use crate::plugin::PluginEvents; use crate::repository::CanonicalPackagesTrait; @@ -178,14 +177,10 @@ impl LicensesCommand { }; table.add_row(PhpMixed::List(vec![ Box::new(PhpMixed::String(name)), - Box::new(PhpMixed::String( - package - .get_full_pretty_version( - false, - <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV, - ) - .to_string(), - )), + Box::new(PhpMixed::String(package.get_full_pretty_version( + false, + crate::package::DisplayMode::SourceRefIfDev, + ))), Box::new(PhpMixed::String(licenses_str)), ])); } @@ -203,7 +198,10 @@ impl LicensesCommand { let mut dep_info: IndexMap<String, PhpMixed> = IndexMap::new(); dep_info.insert( "version".to_string(), - PhpMixed::String(package.get_full_pretty_version(true, 0).to_string()), + PhpMixed::String(package.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + )), ); dep_info.insert( "license".to_string(), diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs index e7fcfe1..f992798 100644 --- a/crates/shirabe/src/command/show_command.rs +++ b/crates/shirabe/src/command/show_command.rs @@ -606,8 +606,9 @@ impl ShowCommand { && latest_package .as_ref() .unwrap() - .get_full_pretty_version(true, 0) - != package.get_full_pretty_version(true, 0) + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) + != package + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) && (latest_package .as_ref() .unwrap() @@ -905,9 +906,13 @@ impl ShowCommand { // Determine if Composer is checking outdated dependencies and if current package should trigger non-default exit code let mut package_is_up_to_date = if let Some(latest) = latest_package { - latest.get_full_pretty_version(true, 0) - == package.get_full_pretty_version(true, 0) - && latest.as_complete().map_or(true, |c| !c.is_abandoned()) + latest.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + ) == package.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + ) && latest.as_complete().map_or(true, |c| !c.is_abandoned()) } else { false }; @@ -967,7 +972,10 @@ impl ShowCommand { } name_length = name_length.max(package.get_pretty_name().len()); if write_version { - let mut version_str = package.get_full_pretty_version(true, 0); + let mut version_str = package.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + ); if format == "text" { version_str = version_str.trim_start_matches('v').to_string(); } @@ -1003,7 +1011,10 @@ impl ShowCommand { } if write_latest && latest_package.is_some() { let latest = latest_package.unwrap(); - let mut latest_version_str = latest.get_full_pretty_version(true, 0); + let mut latest_version_str = latest.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev, + ); if format == "text" { latest_version_str = latest_version_str.trim_start_matches('v').to_string(); @@ -2518,8 +2529,8 @@ impl ShowCommand { latest_package: PackageInterfaceHandle, package: PackageInterfaceHandle, ) -> String { - if latest_package.get_full_pretty_version(true, 0) - == package.get_full_pretty_version(true, 0) + if latest_package.get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) + == package.get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) { return "up-to-date".to_string(); } diff --git a/crates/shirabe/src/dependency_resolver/operation/install_operation.rs b/crates/shirabe/src/dependency_resolver/operation/install_operation.rs index 23be038..1331591 100644 --- a/crates/shirabe/src/dependency_resolver/operation/install_operation.rs +++ b/crates/shirabe/src/dependency_resolver/operation/install_operation.rs @@ -2,7 +2,6 @@ use crate::dependency_resolver::operation::OperationInterface; use crate::dependency_resolver::operation::SolverOperation; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; #[derive(Debug)] @@ -24,8 +23,7 @@ impl InstallOperation { "{}<info>{}</info> (<comment>{}</comment>)", if lock { "Locking " } else { "Installing " }, package.get_pretty_name(), - package - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV), + package.get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev), ) } } diff --git a/crates/shirabe/src/dependency_resolver/operation/mark_alias_installed_operation.rs b/crates/shirabe/src/dependency_resolver/operation/mark_alias_installed_operation.rs index a10186a..4ef436b 100644 --- a/crates/shirabe/src/dependency_resolver/operation/mark_alias_installed_operation.rs +++ b/crates/shirabe/src/dependency_resolver/operation/mark_alias_installed_operation.rs @@ -3,7 +3,6 @@ use crate::dependency_resolver::operation::OperationInterface; use crate::dependency_resolver::operation::SolverOperation; use crate::package::AliasPackageHandle; -use crate::package::PackageInterface; #[derive(Debug)] pub struct MarkAliasInstalledOperation { @@ -38,11 +37,11 @@ impl OperationInterface for MarkAliasInstalledOperation { "Marking <info>{}</info> (<comment>{}</comment>) as installed, alias of <info>{}</info> (<comment>{}</comment>)", self.package.get_pretty_name(), self.package - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV), + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev), self.package.get_alias_of().get_pretty_name(), self.package .get_alias_of() - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV,), + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev,), ) } diff --git a/crates/shirabe/src/dependency_resolver/operation/mark_alias_uninstalled_operation.rs b/crates/shirabe/src/dependency_resolver/operation/mark_alias_uninstalled_operation.rs index b9ad26e..41b0979 100644 --- a/crates/shirabe/src/dependency_resolver/operation/mark_alias_uninstalled_operation.rs +++ b/crates/shirabe/src/dependency_resolver/operation/mark_alias_uninstalled_operation.rs @@ -3,7 +3,6 @@ use crate::dependency_resolver::operation::OperationInterface; use crate::dependency_resolver::operation::SolverOperation; use crate::package::AliasPackageHandle; -use crate::package::PackageInterface; #[derive(Debug)] pub struct MarkAliasUninstalledOperation { @@ -38,11 +37,11 @@ impl OperationInterface for MarkAliasUninstalledOperation { "Marking <info>{}</info> (<comment>{}</comment>) as uninstalled, alias of <info>{}</info> (<comment>{}</comment>)", self.package.get_pretty_name(), self.package - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV), + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev), self.package.get_alias_of().get_pretty_name(), self.package .get_alias_of() - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV,), + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev,), ) } diff --git a/crates/shirabe/src/dependency_resolver/operation/uninstall_operation.rs b/crates/shirabe/src/dependency_resolver/operation/uninstall_operation.rs index 3ff547c..465297d 100644 --- a/crates/shirabe/src/dependency_resolver/operation/uninstall_operation.rs +++ b/crates/shirabe/src/dependency_resolver/operation/uninstall_operation.rs @@ -2,7 +2,6 @@ use crate::dependency_resolver::operation::OperationInterface; use crate::dependency_resolver::operation::SolverOperation; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; #[derive(Debug)] @@ -23,8 +22,7 @@ impl UninstallOperation { format!( "Removing <info>{}</info> (<comment>{}</comment>)", package.get_pretty_name(), - package - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV), + package.get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev), ) } } diff --git a/crates/shirabe/src/dependency_resolver/operation/update_operation.rs b/crates/shirabe/src/dependency_resolver/operation/update_operation.rs index bc31256..104f4ef 100644 --- a/crates/shirabe/src/dependency_resolver/operation/update_operation.rs +++ b/crates/shirabe/src/dependency_resolver/operation/update_operation.rs @@ -2,7 +2,6 @@ use crate::dependency_resolver::operation::OperationInterface; use crate::dependency_resolver::operation::SolverOperation; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::package::version::VersionParser; @@ -33,25 +32,25 @@ impl UpdateOperation { target_package: PackageInterfaceHandle, lock: bool, ) -> String { - let mut from_version = initial_package - .get_full_pretty_version(false, <dyn PackageInterface>::DISPLAY_SOURCE_REF); - let mut to_version = target_package - .get_full_pretty_version(false, <dyn PackageInterface>::DISPLAY_SOURCE_REF); + let mut from_version = + initial_package.get_full_pretty_version(false, crate::package::DisplayMode::SourceRef); + let mut to_version = + target_package.get_full_pretty_version(false, crate::package::DisplayMode::SourceRef); if from_version == to_version && initial_package.get_source_reference() != target_package.get_source_reference() { from_version = initial_package - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_SOURCE_REF); + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRef); to_version = target_package - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_SOURCE_REF); + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRef); } else if from_version == to_version && initial_package.get_dist_reference() != target_package.get_dist_reference() { - from_version = initial_package - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_DIST_REF); - to_version = target_package - .get_full_pretty_version(true, <dyn PackageInterface>::DISPLAY_DIST_REF); + from_version = + initial_package.get_full_pretty_version(true, crate::package::DisplayMode::DistRef); + to_version = + target_package.get_full_pretty_version(true, crate::package::DisplayMode::DistRef); } let action_name = if VersionParser::is_upgrade( diff --git a/crates/shirabe/src/downloader/file_downloader.rs b/crates/shirabe/src/downloader/file_downloader.rs index 5b66a9f..55882f7 100644 --- a/crates/shirabe/src/downloader/file_downloader.rs +++ b/crates/shirabe/src/downloader/file_downloader.rs @@ -241,7 +241,10 @@ impl DownloaderInterface for FileDownloader { &format!( " - Loading <info>{}</info> (<comment>{}</comment>) from cache", package.get_name(), - package.get_full_pretty_version(true, 0) + package.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev + ) ), true, io_interface::VERY_VERBOSE, @@ -263,7 +266,10 @@ impl DownloaderInterface for FileDownloader { self.io.write_error(&format!( " - Downloading <info>{}</info> (<comment>{}</comment>)", package.get_name(), - package.get_full_pretty_version(true, 0) + package.get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev + ) )); } diff --git a/crates/shirabe/src/downloader/git_downloader.rs b/crates/shirabe/src/downloader/git_downloader.rs index 05ef096..34f89a4 100644 --- a/crates/shirabe/src/downloader/git_downloader.rs +++ b/crates/shirabe/src/downloader/git_downloader.rs @@ -95,10 +95,8 @@ impl GitDownloader { &format!( " - Syncing <info>{}</info> (<comment>{}</comment>) into cache", package.get_name(), - package.get_full_pretty_version( - true, - <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV, - ), + package + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev), ), true, io_interface::NORMAL, diff --git a/crates/shirabe/src/installer.rs b/crates/shirabe/src/installer.rs index ec374ac..efc41c1 100644 --- a/crates/shirabe/src/installer.rs +++ b/crates/shirabe/src/installer.rs @@ -736,7 +736,10 @@ impl Installer { install_names.push(format!( "{}:{}", io.get_package().get_pretty_name(), - io.get_package().get_full_pretty_version(true, 0) + io.get_package().get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev + ) )); } else if let Some(uo) = operation.as_update_operation() { // when mirrors/metadata from a package gets updated we do not want to list it as an @@ -753,7 +756,10 @@ impl Installer { update_names.push(format!( "{}:{}", uo.get_target_package().get_pretty_name(), - uo.get_target_package().get_full_pretty_version(true, 0) + uo.get_target_package().get_full_pretty_version( + true, + crate::package::DisplayMode::SourceRefIfDev + ) )); } else if let Some(uo) = operation.as_uninstall_operation() { uninstalls.push(operation.clone_box()); @@ -1137,13 +1143,15 @@ impl Installer { installs.push(format!( "{}:{}", io.get_package().get_pretty_name(), - io.get_package().get_full_pretty_version(true, 0) + io.get_package() + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) )); } else if let Some(uo) = operation.as_update_operation() { updates.push(format!( "{}:{}", uo.get_target_package().get_pretty_name(), - uo.get_target_package().get_full_pretty_version(true, 0) + uo.get_target_package() + .get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev) )); } else if let Some(uo) = operation.as_uninstall_operation() { uninstalls.push(uo.get_package().get_pretty_name().to_string()); @@ -1336,8 +1344,8 @@ impl Installer { } self.fixed_root_package = RootPackageInterfaceHandle::dup(&self.package); - self.fixed_root_package.set_requires(vec![]); - self.fixed_root_package.set_dev_requires(vec![]); + self.fixed_root_package.set_requires(IndexMap::new()); + self.fixed_root_package.set_dev_requires(IndexMap::new()); stability_flags.insert( self.package.get_name(), diff --git a/crates/shirabe/src/package/alias_package.rs b/crates/shirabe/src/package/alias_package.rs index b4ddc70..f4b9b55 100644 --- a/crates/shirabe/src/package/alias_package.rs +++ b/crates/shirabe/src/package/alias_package.rs @@ -8,6 +8,7 @@ use shirabe_semver::constraint::SimpleConstraint; use crate::package::BasePackage; use crate::package::Link; +use crate::package::Mirror; use crate::package::PackageHandle; use crate::package::PackageInterface; use crate::package::version::VersionParser; @@ -305,8 +306,8 @@ impl PackageInterface for AliasPackage { todo!("AliasPackage::get_type cannot return &str across the aliasOf handle") } - fn get_target_dir(&self) -> Option<&str> { - todo!("AliasPackage::get_target_dir cannot return &str across the aliasOf handle") + fn get_target_dir(&self) -> Option<String> { + self.alias_of.get_target_dir() } fn get_extra(&self) -> IndexMap<String, PhpMixed> { @@ -341,11 +342,11 @@ impl PackageInterface for AliasPackage { self.alias_of.set_source_reference(reference); } - fn set_source_mirrors(&mut self, mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) { + fn set_source_mirrors(&mut self, mirrors: Option<Vec<Mirror>>) { self.alias_of.set_source_mirrors(mirrors); } - fn get_source_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> { + fn get_source_mirrors(&self) -> Option<Vec<Mirror>> { self.alias_of.get_source_mirrors() } @@ -381,11 +382,11 @@ impl PackageInterface for AliasPackage { self.alias_of.get_transport_options() } - fn set_dist_mirrors(&mut self, mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) { + fn set_dist_mirrors(&mut self, mirrors: Option<Vec<Mirror>>) { self.alias_of.set_dist_mirrors(mirrors); } - fn get_dist_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> { + fn get_dist_mirrors(&self) -> Option<Vec<Mirror>> { self.alias_of.get_dist_mirrors() } @@ -441,7 +442,11 @@ impl PackageInterface for AliasPackage { self.alias_of.set_source_dist_references(reference); } - fn get_full_pretty_version(&self, truncate: bool, display_mode: i64) -> String { + fn get_full_pretty_version( + &self, + truncate: bool, + display_mode: crate::package::DisplayMode, + ) -> String { self.alias_of .get_full_pretty_version(truncate, display_mode) } diff --git a/crates/shirabe/src/package/base_package.rs b/crates/shirabe/src/package/base_package.rs index ca6f171..ec2fd3f 100644 --- a/crates/shirabe/src/package/base_package.rs +++ b/crates/shirabe/src/package/base_package.rs @@ -3,8 +3,9 @@ use std::sync::LazyLock; use indexmap::IndexMap; -use shirabe_php_shim::{LogicException, UnexpectedValueException, preg_quote}; +use shirabe_php_shim::preg_quote; +use crate::package::DisplayMode; use crate::package::Link; use crate::package::PackageInterface; use crate::repository::PlatformRepository; @@ -109,48 +110,38 @@ pub trait BasePackage: PackageInterface + std::fmt::Display { // get_pretty_string is inherited from PackageInterface. - fn get_full_pretty_version(&self, truncate: bool, display_mode: i64) -> anyhow::Result<String> { - const DISPLAY_SOURCE_REF_IF_DEV: i64 = <dyn PackageInterface>::DISPLAY_SOURCE_REF_IF_DEV; - const DISPLAY_SOURCE_REF: i64 = <dyn PackageInterface>::DISPLAY_SOURCE_REF; - const DISPLAY_DIST_REF: i64 = <dyn PackageInterface>::DISPLAY_DIST_REF; - - if display_mode == DISPLAY_SOURCE_REF_IF_DEV + fn get_full_pretty_version(&self, truncate: bool, display_mode: DisplayMode) -> String { + if display_mode == DisplayMode::SourceRefIfDev && (!self.is_dev() || (!["hg", "git"].contains(&self.get_source_type().unwrap_or_default()) && (self.get_source_type().unwrap_or_default() != "" || self.get_dist_reference().unwrap_or_default() == ""))) { - return Ok(self.get_pretty_version().to_string()); + return self.get_pretty_version().to_string(); } let reference: Option<&str> = match display_mode { - DISPLAY_SOURCE_REF_IF_DEV => { + DisplayMode::SourceRefIfDev => { if self.get_source_reference().unwrap_or_default() != "" { self.get_source_reference() } else { self.get_dist_reference() } } - DISPLAY_SOURCE_REF => self.get_source_reference(), - DISPLAY_DIST_REF => self.get_dist_reference(), - _ => { - return Err(anyhow::anyhow!(UnexpectedValueException { - message: format!("Display mode {} is not supported", display_mode), - code: 0, - })); - } + DisplayMode::SourceRef => self.get_source_reference(), + DisplayMode::DistRef => self.get_dist_reference(), }; let reference = match reference { - None => return Ok(self.get_pretty_version().to_string()), + None => return self.get_pretty_version().to_string(), Some(r) => r, }; if truncate && reference.len() == 40 && self.get_source_type() != Some("svn") { - return Ok(format!("{} {}", self.get_pretty_version(), &reference[..7])); + return format!("{} {}", self.get_pretty_version(), &reference[..7]); } - Ok(format!("{} {}", self.get_pretty_version(), reference)) + format!("{} {}", self.get_pretty_version(), reference) } fn get_stability_priority(&self) -> i64 { diff --git a/crates/shirabe/src/package/complete_package.rs b/crates/shirabe/src/package/complete_package.rs index 97669d8..f8293a5 100644 --- a/crates/shirabe/src/package/complete_package.rs +++ b/crates/shirabe/src/package/complete_package.rs @@ -1,6 +1,8 @@ //! ref: composer/src/Composer/Package/CompletePackage.php use crate::package::CompletePackageInterface; +use crate::package::DisplayMode; +use crate::package::Mirror; use crate::package::Package; use crate::package::PackageInterface; use indexmap::IndexMap; @@ -154,159 +156,159 @@ impl CompletePackageInterface for CompletePackage { impl PackageInterface for CompletePackage { fn get_name(&self) -> &str { - todo!() + self.inner.get_name() } fn get_pretty_name(&self) -> &str { - todo!() + self.inner.get_pretty_name() } fn get_names(&self, provides: bool) -> Vec<String> { - todo!() + self.inner.get_names(provides) } fn set_id(&mut self, id: i64) { - todo!() + self.inner.set_id(id); } fn get_id(&self) -> i64 { - todo!() + self.inner.get_id() } fn is_dev(&self) -> bool { - todo!() + self.inner.is_dev() } fn get_type(&self) -> &str { - todo!() + PackageInterface::get_type(&self.inner) } - fn get_target_dir(&self) -> Option<&str> { - todo!() + fn get_target_dir(&self) -> Option<String> { + self.inner.get_target_dir() } fn get_extra(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.inner.get_extra().clone() } fn set_installation_source(&mut self, r#type: Option<String>) { - todo!() + self.inner.set_installation_source(r#type); } fn get_installation_source(&self) -> Option<&str> { - todo!() + self.inner.get_installation_source() } fn get_source_type(&self) -> Option<&str> { - todo!() + self.inner.get_source_type() } fn get_source_url(&self) -> Option<&str> { - todo!() + self.inner.get_source_url() } fn get_source_urls(&self) -> Vec<String> { - todo!() + self.inner.get_source_urls() } fn get_source_reference(&self) -> Option<&str> { - todo!() + self.inner.get_source_reference() } - fn get_source_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> { - todo!() + fn get_source_mirrors(&self) -> Option<Vec<Mirror>> { + self.inner.get_source_mirrors().cloned() } - fn set_source_mirrors(&mut self, mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) { - todo!() + fn set_source_mirrors(&mut self, mirrors: Option<Vec<Mirror>>) { + self.inner.set_source_mirrors(mirrors); } fn get_dist_type(&self) -> Option<&str> { - todo!() + self.inner.get_dist_type() } fn get_dist_url(&self) -> Option<&str> { - todo!() + self.inner.get_dist_url() } fn get_dist_urls(&self) -> Vec<String> { - todo!() + self.inner.get_dist_urls() } fn get_dist_reference(&self) -> Option<&str> { - todo!() + self.inner.get_dist_reference() } fn get_dist_sha1_checksum(&self) -> Option<&str> { - todo!() + self.inner.get_dist_sha1_checksum() } - fn get_dist_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> { - todo!() + fn get_dist_mirrors(&self) -> Option<Vec<Mirror>> { + self.inner.get_dist_mirrors().cloned() } - fn set_dist_mirrors(&mut self, mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) { - todo!() + fn set_dist_mirrors(&mut self, mirrors: Option<Vec<Mirror>>) { + self.inner.set_dist_mirrors(mirrors); } fn get_version(&self) -> &str { - todo!() + self.inner.get_version() } fn get_pretty_version(&self) -> &str { - todo!() + self.inner.get_pretty_version() } - fn get_full_pretty_version(&self, truncate: bool, display_mode: i64) -> String { - todo!() + fn get_full_pretty_version(&self, truncate: bool, display_mode: DisplayMode) -> String { + PackageInterface::get_full_pretty_version(&self.inner, truncate, display_mode) } fn get_release_date(&self) -> Option<chrono::DateTime<chrono::Utc>> { - todo!() + self.inner.get_release_date().copied() } fn get_stability(&self) -> &str { - todo!() + self.inner.get_stability() } fn get_requires(&self) -> IndexMap<String, super::Link> { - todo!() + self.inner.get_requires().clone() } fn get_conflicts(&self) -> IndexMap<String, super::Link> { - todo!() + self.inner.get_conflicts().clone() } fn get_provides(&self) -> IndexMap<String, super::Link> { - todo!() + self.inner.get_provides().clone() } fn get_replaces(&self) -> IndexMap<String, super::Link> { - todo!() + self.inner.get_replaces().clone() } fn get_dev_requires(&self) -> IndexMap<String, super::Link> { - todo!() + self.inner.get_dev_requires().clone() } fn get_suggests(&self) -> IndexMap<String, String> { - todo!() + self.inner.get_suggests().clone() } fn get_autoload(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.inner.get_autoload().clone() } fn get_dev_autoload(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.inner.get_dev_autoload().clone() } fn get_include_paths(&self) -> Vec<String> { - todo!() + self.inner.get_include_paths().clone() } fn get_php_ext(&self) -> Option<IndexMap<String, PhpMixed>> { - todo!() + self.inner.get_php_ext().cloned() } fn set_repository( @@ -321,55 +323,55 @@ impl PackageInterface for CompletePackage { } fn get_binaries(&self) -> Vec<String> { - todo!() + self.inner.get_binaries().clone() } fn get_unique_name(&self) -> String { - todo!() + self.inner.get_unique_name() } fn get_notification_url(&self) -> Option<&str> { - todo!() + self.inner.get_notification_url() } fn get_pretty_string(&self) -> String { - todo!() + self.inner.get_pretty_string() } fn is_default_branch(&self) -> bool { - todo!() + self.inner.is_default_branch() } fn get_transport_options(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.inner.get_transport_options().clone() } fn set_transport_options(&mut self, options: IndexMap<String, PhpMixed>) { - todo!() + self.inner.set_transport_options(options); } fn set_source_reference(&mut self, reference: Option<String>) { - todo!() + self.inner.set_source_reference(reference); } fn set_source_url(&mut self, url: Option<String>) { - todo!() + self.inner.set_source_url(url); } fn set_dist_url(&mut self, url: Option<String>) { - todo!() + self.inner.set_dist_url(url); } fn set_dist_type(&mut self, r#type: Option<String>) { - todo!() + self.inner.set_dist_type(r#type); } fn set_dist_reference(&mut self, reference: Option<String>) { - todo!() + self.inner.set_dist_reference(reference); } fn set_source_dist_references(&mut self, reference: &str) { - todo!() + PackageInterface::set_source_dist_references(&mut self.inner, reference); } } diff --git a/crates/shirabe/src/package/dumper/array_dumper.rs b/crates/shirabe/src/package/dumper/array_dumper.rs index 3d3b27a..3523d58 100644 --- a/crates/shirabe/src/package/dumper/array_dumper.rs +++ b/crates/shirabe/src/package/dumper/array_dumper.rs @@ -3,9 +3,21 @@ use indexmap::IndexMap; use shirabe_php_shim::PhpMixed; +use crate::package::Mirror; use crate::package::PackageInterfaceHandle; use crate::package::SUPPORTED_LINK_TYPES; +/// Serializes a Mirror back into the PHP array shape `{url, preferred}`. +fn mirror_to_php(mirror: Mirror) -> PhpMixed { + let mut entry: IndexMap<String, Box<PhpMixed>> = IndexMap::new(); + entry.insert("url".to_string(), Box::new(PhpMixed::String(mirror.url))); + entry.insert( + "preferred".to_string(), + Box::new(PhpMixed::Bool(mirror.preferred)), + ); + PhpMixed::Array(entry) +} + #[derive(Debug)] pub struct ArrayDumper; @@ -62,14 +74,7 @@ impl ArrayDumper { mirrors .into_iter() .enumerate() - .map(|(i, m)| { - ( - i.to_string(), - Box::new(PhpMixed::Array( - m.into_iter().map(|(k, v)| (k, Box::new(v))).collect(), - )), - ) - }) + .map(|(i, m)| (i.to_string(), Box::new(mirror_to_php(m)))) .collect(), )), ); @@ -108,14 +113,7 @@ impl ArrayDumper { mirrors .into_iter() .enumerate() - .map(|(i, m)| { - ( - i.to_string(), - Box::new(PhpMixed::Array( - m.into_iter().map(|(k, v)| (k, Box::new(v))).collect(), - )), - ) - }) + .map(|(i, m)| (i.to_string(), Box::new(mirror_to_php(m)))) .collect(), )), ); diff --git a/crates/shirabe/src/package/handle.rs b/crates/shirabe/src/package/handle.rs index aecc219..aa21bf1 100644 --- a/crates/shirabe/src/package/handle.rs +++ b/crates/shirabe/src/package/handle.rs @@ -193,7 +193,7 @@ macro_rules! delegate_package_interface_to_inner { fn get_type(&self) -> &str { self.$field.get_type() } - fn get_target_dir(&self) -> Option<&str> { + fn get_target_dir(&self) -> Option<String> { self.$field.get_target_dir() } fn get_extra(&self) -> indexmap::IndexMap<String, shirabe_php_shim::PhpMixed> { @@ -217,15 +217,10 @@ macro_rules! delegate_package_interface_to_inner { fn get_source_reference(&self) -> Option<&str> { self.$field.get_source_reference() } - fn get_source_mirrors( - &self, - ) -> Option<Vec<indexmap::IndexMap<String, shirabe_php_shim::PhpMixed>>> { + fn get_source_mirrors(&self) -> Option<Vec<crate::package::Mirror>> { self.$field.get_source_mirrors() } - fn set_source_mirrors( - &mut self, - mirrors: Option<Vec<indexmap::IndexMap<String, shirabe_php_shim::PhpMixed>>>, - ) { + fn set_source_mirrors(&mut self, mirrors: Option<Vec<crate::package::Mirror>>) { self.$field.set_source_mirrors(mirrors); } fn get_dist_type(&self) -> Option<&str> { @@ -243,15 +238,10 @@ macro_rules! delegate_package_interface_to_inner { fn get_dist_sha1_checksum(&self) -> Option<&str> { self.$field.get_dist_sha1_checksum() } - fn get_dist_mirrors( - &self, - ) -> Option<Vec<indexmap::IndexMap<String, shirabe_php_shim::PhpMixed>>> { + fn get_dist_mirrors(&self) -> Option<Vec<crate::package::Mirror>> { self.$field.get_dist_mirrors() } - fn set_dist_mirrors( - &mut self, - mirrors: Option<Vec<indexmap::IndexMap<String, shirabe_php_shim::PhpMixed>>>, - ) { + fn set_dist_mirrors(&mut self, mirrors: Option<Vec<crate::package::Mirror>>) { self.$field.set_dist_mirrors(mirrors); } fn get_version(&self) -> &str { @@ -260,7 +250,11 @@ macro_rules! delegate_package_interface_to_inner { fn get_pretty_version(&self) -> &str { self.$field.get_pretty_version() } - fn get_full_pretty_version(&self, truncate: bool, display_mode: i64) -> String { + fn get_full_pretty_version( + &self, + truncate: bool, + display_mode: crate::package::DisplayMode, + ) -> String { self.$field.get_full_pretty_version(truncate, display_mode) } fn get_release_date(&self) -> Option<chrono::DateTime<chrono::Utc>> { @@ -408,11 +402,7 @@ macro_rules! impl_package_interface_handle { } pub fn get_target_dir(&self) -> Option<String> { - self.0 - .borrow() - .as_package_interface() - .get_target_dir() - .map(str::to_string) + self.0.borrow().as_package_interface().get_target_dir() } pub fn get_extra(&self) -> indexmap::IndexMap<String, shirabe_php_shim::PhpMixed> { @@ -462,16 +452,11 @@ macro_rules! impl_package_interface_handle { .map(str::to_string) } - pub fn get_source_mirrors( - &self, - ) -> Option<Vec<indexmap::IndexMap<String, shirabe_php_shim::PhpMixed>>> { + pub fn get_source_mirrors(&self) -> Option<Vec<crate::package::Mirror>> { self.0.borrow().as_package_interface().get_source_mirrors() } - pub fn set_source_mirrors( - &self, - mirrors: Option<Vec<indexmap::IndexMap<String, shirabe_php_shim::PhpMixed>>>, - ) { + pub fn set_source_mirrors(&self, mirrors: Option<Vec<crate::package::Mirror>>) { self.0 .borrow_mut() .as_package_interface_mut() @@ -514,16 +499,11 @@ macro_rules! impl_package_interface_handle { .map(str::to_string) } - pub fn get_dist_mirrors( - &self, - ) -> Option<Vec<indexmap::IndexMap<String, shirabe_php_shim::PhpMixed>>> { + pub fn get_dist_mirrors(&self) -> Option<Vec<crate::package::Mirror>> { self.0.borrow().as_package_interface().get_dist_mirrors() } - pub fn set_dist_mirrors( - &self, - mirrors: Option<Vec<indexmap::IndexMap<String, shirabe_php_shim::PhpMixed>>>, - ) { + pub fn set_dist_mirrors(&self, mirrors: Option<Vec<crate::package::Mirror>>) { self.0 .borrow_mut() .as_package_interface_mut() @@ -546,7 +526,11 @@ macro_rules! impl_package_interface_handle { .to_string() } - pub fn get_full_pretty_version(&self, truncate: bool, display_mode: i64) -> String { + pub fn get_full_pretty_version( + &self, + truncate: bool, + display_mode: crate::package::DisplayMode, + ) -> String { self.0 .borrow() .as_package_interface() @@ -997,7 +981,7 @@ macro_rules! impl_root_package_interface_handle { .clone() } - pub fn set_requires(&self, requires: Vec<crate::package::Link>) { + pub fn set_requires(&self, requires: indexmap::IndexMap<String, crate::package::Link>) { self.0 .borrow_mut() .as_root_package_interface_mut() @@ -1005,7 +989,10 @@ macro_rules! impl_root_package_interface_handle { .set_requires(requires); } - pub fn set_dev_requires(&self, dev_requires: Vec<crate::package::Link>) { + pub fn set_dev_requires( + &self, + dev_requires: indexmap::IndexMap<String, crate::package::Link>, + ) { self.0 .borrow_mut() .as_root_package_interface_mut() @@ -1013,7 +1000,10 @@ macro_rules! impl_root_package_interface_handle { .set_dev_requires(dev_requires); } - pub fn set_conflicts(&self, conflicts: Vec<crate::package::Link>) { + pub fn set_conflicts( + &self, + conflicts: indexmap::IndexMap<String, crate::package::Link>, + ) { self.0 .borrow_mut() .as_root_package_interface_mut() @@ -1021,7 +1011,7 @@ macro_rules! impl_root_package_interface_handle { .set_conflicts(conflicts); } - pub fn set_provides(&self, provides: Vec<crate::package::Link>) { + pub fn set_provides(&self, provides: indexmap::IndexMap<String, crate::package::Link>) { self.0 .borrow_mut() .as_root_package_interface_mut() @@ -1029,7 +1019,7 @@ macro_rules! impl_root_package_interface_handle { .set_provides(provides); } - pub fn set_replaces(&self, replaces: Vec<crate::package::Link>) { + pub fn set_replaces(&self, replaces: indexmap::IndexMap<String, crate::package::Link>) { self.0 .borrow_mut() .as_root_package_interface_mut() diff --git a/crates/shirabe/src/package/package.rs b/crates/shirabe/src/package/package.rs index f573326..f1c8cc9 100644 --- a/crates/shirabe/src/package/package.rs +++ b/crates/shirabe/src/package/package.rs @@ -3,13 +3,14 @@ use std::rc::Rc; use chrono::{DateTime, Utc}; -use indexmap::IndexMap; +use indexmap::{IndexMap, IndexSet}; use shirabe_external_packages::composer::pcre::Preg; use shirabe_external_packages::composer::util::ComposerMirror; use shirabe_php_shim::{E_USER_DEPRECATED, LogicException, PhpMixed, strpos, trigger_error}; use crate::package::BasePackage; +use crate::package::DisplayMode; use crate::package::Link; use crate::package::PackageInterface; use crate::package::version::VersionParser; @@ -583,128 +584,144 @@ impl BasePackage for Package { } impl std::fmt::Display for Package { - fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - todo!() + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.get_unique_name()) } } impl PackageInterface for Package { fn get_name(&self) -> &str { - todo!() + &self.name } fn get_pretty_name(&self) -> &str { - todo!() + &self.pretty_name } - fn get_names(&self, _provides: bool) -> Vec<String> { - todo!() + fn get_names(&self, provides: bool) -> Vec<String> { + let mut names: IndexSet<String> = IndexSet::new(); + names.insert(self.get_name().to_string()); + + if provides { + for (_, link) in self.get_provides() { + names.insert(link.get_target().to_string()); + } + } + + for (_, link) in self.get_replaces() { + names.insert(link.get_target().to_string()); + } + + names.into_iter().collect() } - fn set_id(&mut self, _id: i64) { - todo!() + fn set_id(&mut self, id: i64) { + self.id = id; } fn get_id(&self) -> i64 { - todo!() + self.id } fn is_dev(&self) -> bool { - todo!() + self.dev } fn get_type(&self) -> &str { - todo!() + self.r#type + .as_deref() + .filter(|s| !s.is_empty()) + .unwrap_or("library") } - fn get_target_dir(&self) -> Option<&str> { - todo!() + fn get_target_dir(&self) -> Option<String> { + Package::get_target_dir(self) } fn get_extra(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.extra.clone() } - fn set_installation_source(&mut self, _type: Option<String>) { - todo!() + fn set_installation_source(&mut self, r#type: Option<String>) { + self.installation_source = r#type; } fn get_installation_source(&self) -> Option<&str> { - todo!() + self.installation_source.as_deref() } fn get_source_type(&self) -> Option<&str> { - todo!() + self.source_type.as_deref() } fn get_source_url(&self) -> Option<&str> { - todo!() + self.source_url.as_deref() } fn get_source_urls(&self) -> Vec<String> { - todo!() + Package::get_source_urls(self) } fn get_source_reference(&self) -> Option<&str> { - todo!() + self.source_reference.as_deref() } - fn get_source_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> { - todo!() + fn get_source_mirrors(&self) -> Option<Vec<Mirror>> { + self.source_mirrors.clone() } - fn set_source_mirrors(&mut self, _mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) { - todo!() + fn set_source_mirrors(&mut self, mirrors: Option<Vec<Mirror>>) { + self.source_mirrors = mirrors; } fn get_dist_type(&self) -> Option<&str> { - todo!() + self.dist_type.as_deref() } fn get_dist_url(&self) -> Option<&str> { - todo!() + self.dist_url.as_deref() } fn get_dist_urls(&self) -> Vec<String> { - todo!() + Package::get_dist_urls(self) } fn get_dist_reference(&self) -> Option<&str> { - todo!() + self.dist_reference.as_deref() } fn get_dist_sha1_checksum(&self) -> Option<&str> { - todo!() + self.dist_sha1_checksum.as_deref() } - fn get_dist_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> { - todo!() + fn get_dist_mirrors(&self) -> Option<Vec<Mirror>> { + self.dist_mirrors.clone() } - fn set_dist_mirrors(&mut self, _mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) { - todo!() + fn set_dist_mirrors(&mut self, mirrors: Option<Vec<Mirror>>) { + self.dist_mirrors = mirrors; } fn get_version(&self) -> &str { - todo!() + &self.version } fn get_pretty_version(&self) -> &str { - todo!() + &self.pretty_version } - fn get_full_pretty_version(&self, _truncate: bool, _display_mode: i64) -> String { - todo!() + fn get_full_pretty_version(&self, truncate: bool, display_mode: DisplayMode) -> String { + BasePackage::get_full_pretty_version(self, truncate, display_mode) } fn get_release_date(&self) -> Option<DateTime<Utc>> { - todo!() + self.release_date } fn get_stability(&self) -> &str { - todo!() + &self.stability } fn get_requires(&self) -> IndexMap<String, Link> { - todo!() + self.requires.clone() } fn get_conflicts(&self) -> IndexMap<String, Link> { - todo!() + self.conflicts.clone() } fn get_provides(&self) -> IndexMap<String, Link> { - todo!() + self.provides.clone() } fn get_replaces(&self) -> IndexMap<String, Link> { - todo!() + self.replaces.clone() } fn get_dev_requires(&self) -> IndexMap<String, Link> { - todo!() + self.dev_requires.clone() } fn get_suggests(&self) -> IndexMap<String, String> { - todo!() + self.suggests.clone() } fn get_autoload(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.autoload.clone() } fn get_dev_autoload(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.dev_autoload.clone() } fn get_include_paths(&self) -> Vec<String> { - todo!() + self.include_paths.clone() } fn get_php_ext(&self) -> Option<IndexMap<String, PhpMixed>> { - todo!() + self.php_ext.clone() } fn set_repository(&mut self, repository: RepositoryInterfaceHandle) -> anyhow::Result<()> { if let Some(existing) = self.repository.as_ref().and_then(|w| w.upgrade()) { @@ -726,42 +743,48 @@ impl PackageInterface for Package { .map(RepositoryInterfaceHandle::from_rc) } fn get_binaries(&self) -> Vec<String> { - todo!() + self.binaries.clone() } fn get_unique_name(&self) -> String { - todo!() + format!("{}-{}", self.get_name(), self.get_version()) } fn get_notification_url(&self) -> Option<&str> { - todo!() + self.notification_url.as_deref() } fn get_pretty_string(&self) -> String { - todo!() + format!("{} {}", self.get_pretty_name(), self.get_pretty_version()) } fn is_default_branch(&self) -> bool { - todo!() + self.is_default_branch } fn get_transport_options(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.transport_options.clone() } - fn set_transport_options(&mut self, _options: IndexMap<String, PhpMixed>) { - todo!() + fn set_transport_options(&mut self, options: IndexMap<String, PhpMixed>) { + self.transport_options = options; } - fn set_source_reference(&mut self, _reference: Option<String>) { - todo!() + fn set_source_reference(&mut self, reference: Option<String>) { + self.source_reference = reference; } - fn set_source_url(&mut self, _url: Option<String>) { - todo!() + fn set_source_url(&mut self, url: Option<String>) { + self.source_url = url; } - fn set_dist_url(&mut self, _url: Option<String>) { - todo!() + fn set_dist_url(&mut self, url: Option<String>) { + self.dist_url = match url.as_deref() { + Some("") => None, + _ => url, + }; } - fn set_dist_type(&mut self, _type: Option<String>) { - todo!() + fn set_dist_type(&mut self, r#type: Option<String>) { + self.dist_type = match r#type.as_deref() { + Some("") => None, + _ => r#type, + }; } - fn set_dist_reference(&mut self, _reference: Option<String>) { - todo!() + fn set_dist_reference(&mut self, reference: Option<String>) { + self.dist_reference = reference; } - fn set_source_dist_references(&mut self, _reference: &str) { - todo!() + fn set_source_dist_references(&mut self, reference: &str) { + Package::set_source_dist_references(self, reference.to_string()); } } diff --git a/crates/shirabe/src/package/package_interface.rs b/crates/shirabe/src/package/package_interface.rs index 0ab2a09..285a30b 100644 --- a/crates/shirabe/src/package/package_interface.rs +++ b/crates/shirabe/src/package/package_interface.rs @@ -5,8 +5,21 @@ use indexmap::IndexMap; use shirabe_php_shim::PhpMixed; use crate::package::Link; +use crate::package::Mirror; use crate::repository::RepositoryInterfaceHandle; +/// Selects how `get_full_pretty_version` renders the reference. +/// +/// ref: PackageInterface::DISPLAY_SOURCE_REF_IF_DEV +/// ref: PackageInterface::DISPLAY_SOURCE_REF +/// ref: PackageInterface::DISPLAY_DIST_REF +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum DisplayMode { + SourceRefIfDev, + SourceRef, + DistRef, +} + /// Defines the essential information a package has that is used during solving/installation /// /// PackageInterface & derivatives are considered internal, you may use them in type hints but extending/implementing them is not recommended and not supported. Things may change without notice. @@ -54,7 +67,7 @@ pub trait PackageInterface: std::fmt::Display + std::fmt::Debug { /// Returns the package targetDir property /// /// @return ?string The package targetDir - fn get_target_dir(&self) -> Option<&str>; + fn get_target_dir(&self) -> Option<String>; /// Returns the package extra data /// @@ -96,10 +109,10 @@ pub trait PackageInterface: std::fmt::Display + std::fmt::Debug { /// Returns the source mirrors of this package /// /// @return ?list<array{url: non-empty-string, preferred: bool}> - fn get_source_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>>; + fn get_source_mirrors(&self) -> Option<Vec<Mirror>>; /// @param null|list<array{url: non-empty-string, preferred: bool}> $mirrors - fn set_source_mirrors(&mut self, mirrors: Option<Vec<IndexMap<String, PhpMixed>>>); + fn set_source_mirrors(&mut self, mirrors: Option<Vec<Mirror>>); /// Returns the type of the distribution archive of this version, e.g. zip, tarball /// @@ -127,10 +140,10 @@ pub trait PackageInterface: std::fmt::Display + std::fmt::Debug { /// Returns the dist mirrors of this package /// /// @return ?list<array{url: non-empty-string, preferred: bool}> - fn get_dist_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>>; + fn get_dist_mirrors(&self) -> Option<Vec<Mirror>>; /// @param null|list<array{url: non-empty-string, preferred: bool}> $mirrors - fn set_dist_mirrors(&mut self, mirrors: Option<Vec<IndexMap<String, PhpMixed>>>); + fn set_dist_mirrors(&mut self, mirrors: Option<Vec<Mirror>>); /// Returns the version of this package /// @@ -149,9 +162,7 @@ pub trait PackageInterface: std::fmt::Display + std::fmt::Debug { /// @param bool $truncate If the source reference is a sha1 hash, truncate it /// @param int $displayMode One of the DISPLAY_ constants on this interface determining display of references /// @return string version - /// - /// @phpstan-param self::DISPLAY_SOURCE_REF_IF_DEV|self::DISPLAY_SOURCE_REF|self::DISPLAY_DIST_REF $displayMode - fn get_full_pretty_version(&self, truncate: bool, display_mode: i64) -> String; + fn get_full_pretty_version(&self, truncate: bool, display_mode: DisplayMode) -> String; /// Returns the release date of the package fn get_release_date(&self) -> Option<DateTime<Utc>>; @@ -308,9 +319,3 @@ pub trait PackageInterface: std::fmt::Display + std::fmt::Debug { None } } - -impl dyn PackageInterface { - pub const DISPLAY_SOURCE_REF_IF_DEV: i64 = 0; - pub const DISPLAY_SOURCE_REF: i64 = 1; - pub const DISPLAY_DIST_REF: i64 = 2; -} diff --git a/crates/shirabe/src/package/root_alias_package.rs b/crates/shirabe/src/package/root_alias_package.rs index 67e123b..de4733a 100644 --- a/crates/shirabe/src/package/root_alias_package.rs +++ b/crates/shirabe/src/package/root_alias_package.rs @@ -82,11 +82,11 @@ impl RootPackageInterface for RootAliasPackage { todo!("RootAliasPackage::get_config cannot return a borrow across the aliasOf handle") } - fn set_requires(&mut self, requires: Vec<Link>) { - let replaced = self - .inner - .inner - .replace_self_version_dependencies(requires.clone(), Link::TYPE_REQUIRE); + fn set_requires(&mut self, requires: IndexMap<String, Link>) { + let replaced = self.inner.inner.replace_self_version_dependencies( + requires.values().cloned().collect(), + Link::TYPE_REQUIRE, + ); self.inner.inner.requires = replaced .into_iter() .map(|l| (l.get_target().to_string(), l)) @@ -94,19 +94,19 @@ impl RootPackageInterface for RootAliasPackage { self.alias_of.set_requires(requires); } - fn set_dev_requires(&mut self, dev_requires: Vec<Link>) { + fn set_dev_requires(&mut self, dev_requires: IndexMap<String, Link>) { self.alias_of.set_dev_requires(dev_requires); } - fn set_conflicts(&mut self, conflicts: Vec<Link>) { + fn set_conflicts(&mut self, conflicts: IndexMap<String, Link>) { self.alias_of.set_conflicts(conflicts); } - fn set_provides(&mut self, provides: Vec<Link>) { + fn set_provides(&mut self, provides: IndexMap<String, Link>) { self.alias_of.set_provides(provides); } - fn set_replaces(&mut self, replaces: Vec<Link>) { + fn set_replaces(&mut self, replaces: IndexMap<String, Link>) { self.alias_of.set_replaces(replaces); } diff --git a/crates/shirabe/src/package/root_package.rs b/crates/shirabe/src/package/root_package.rs index 9cedc1a..c599612 100644 --- a/crates/shirabe/src/package/root_package.rs +++ b/crates/shirabe/src/package/root_package.rs @@ -6,7 +6,9 @@ use shirabe_php_shim::PhpMixed; use crate::package::CompletePackage; use crate::package::CompletePackageInterface; +use crate::package::DisplayMode; use crate::package::Link; +use crate::package::Mirror; use crate::package::PackageInterface; use crate::package::RootPackageInterface; use crate::repository::RepositoryInterfaceHandle; @@ -88,268 +90,268 @@ impl RootPackageInterface for RootPackage { &self.aliases } - fn set_requires(&mut self, requires: Vec<super::Link>) { - todo!() + fn set_requires(&mut self, requires: IndexMap<String, Link>) { + self.inner.inner.set_requires(requires); } - fn set_dev_requires(&mut self, dev_requires: Vec<super::Link>) { - todo!() + fn set_dev_requires(&mut self, dev_requires: IndexMap<String, Link>) { + self.inner.inner.set_dev_requires(dev_requires); } - fn set_conflicts(&mut self, conflicts: Vec<super::Link>) { - todo!() + fn set_conflicts(&mut self, conflicts: IndexMap<String, Link>) { + self.inner.inner.set_conflicts(conflicts); } - fn set_provides(&mut self, provides: Vec<super::Link>) { - todo!() + fn set_provides(&mut self, provides: IndexMap<String, Link>) { + self.inner.inner.set_provides(provides); } - fn set_replaces(&mut self, replaces: Vec<super::Link>) { - todo!() + fn set_replaces(&mut self, replaces: IndexMap<String, Link>) { + self.inner.inner.set_replaces(replaces); } fn set_autoload(&mut self, autoload: IndexMap<String, PhpMixed>) { - todo!() + self.inner.inner.set_autoload(autoload); } fn set_dev_autoload(&mut self, dev_autoload: IndexMap<String, PhpMixed>) { - todo!() + self.inner.inner.set_dev_autoload(dev_autoload); } fn set_suggests(&mut self, suggests: IndexMap<String, String>) { - todo!() + self.inner.inner.set_suggests(suggests); } fn set_extra(&mut self, extra: IndexMap<String, PhpMixed>) { - todo!() + self.inner.inner.set_extra(extra); } } impl CompletePackageInterface for RootPackage { fn get_scripts(&self) -> IndexMap<String, Vec<String>> { - todo!() + CompletePackageInterface::get_scripts(&self.inner) } fn set_scripts(&mut self, scripts: IndexMap<String, Vec<String>>) { - todo!() + CompletePackageInterface::set_scripts(&mut self.inner, scripts) } fn get_repositories(&self) -> Vec<IndexMap<String, PhpMixed>> { - todo!() + CompletePackageInterface::get_repositories(&self.inner) } fn set_repositories(&mut self, repositories: Vec<IndexMap<String, PhpMixed>>) { - todo!() + CompletePackageInterface::set_repositories(&mut self.inner, repositories) } fn get_license(&self) -> Vec<String> { - todo!() + CompletePackageInterface::get_license(&self.inner) } fn set_license(&mut self, license: Vec<String>) { - todo!() + CompletePackageInterface::set_license(&mut self.inner, license) } fn get_keywords(&self) -> Vec<String> { - todo!() + CompletePackageInterface::get_keywords(&self.inner) } fn set_keywords(&mut self, keywords: Vec<String>) { - todo!() + CompletePackageInterface::set_keywords(&mut self.inner, keywords) } fn get_description(&self) -> Option<&str> { - todo!() + CompletePackageInterface::get_description(&self.inner) } fn set_description(&mut self, description: String) { - todo!() + CompletePackageInterface::set_description(&mut self.inner, description) } fn get_homepage(&self) -> Option<&str> { - todo!() + CompletePackageInterface::get_homepage(&self.inner) } fn set_homepage(&mut self, homepage: String) { - todo!() + CompletePackageInterface::set_homepage(&mut self.inner, homepage) } fn get_authors(&self) -> Vec<IndexMap<String, String>> { - todo!() + CompletePackageInterface::get_authors(&self.inner) } fn set_authors(&mut self, authors: Vec<IndexMap<String, String>>) { - todo!() + CompletePackageInterface::set_authors(&mut self.inner, authors) } fn get_support(&self) -> IndexMap<String, String> { - todo!() + CompletePackageInterface::get_support(&self.inner) } fn set_support(&mut self, support: IndexMap<String, String>) { - todo!() + CompletePackageInterface::set_support(&mut self.inner, support) } fn get_funding(&self) -> Vec<IndexMap<String, PhpMixed>> { - todo!() + CompletePackageInterface::get_funding(&self.inner) } fn set_funding(&mut self, funding: Vec<IndexMap<String, PhpMixed>>) { - todo!() + CompletePackageInterface::set_funding(&mut self.inner, funding) } fn is_abandoned(&self) -> bool { - todo!() + CompletePackageInterface::is_abandoned(&self.inner) } fn get_replacement_package(&self) -> Option<&str> { - todo!() + CompletePackageInterface::get_replacement_package(&self.inner) } fn set_abandoned(&mut self, abandoned: PhpMixed) { - todo!() + CompletePackageInterface::set_abandoned(&mut self.inner, abandoned) } fn get_archive_name(&self) -> Option<&str> { - todo!() + CompletePackageInterface::get_archive_name(&self.inner) } fn set_archive_name(&mut self, name: String) { - todo!() + CompletePackageInterface::set_archive_name(&mut self.inner, name) } fn get_archive_excludes(&self) -> Vec<String> { - todo!() + CompletePackageInterface::get_archive_excludes(&self.inner) } fn set_archive_excludes(&mut self, excludes: Vec<String>) { - todo!() + CompletePackageInterface::set_archive_excludes(&mut self.inner, excludes) } } impl std::fmt::Display for RootPackage { - fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - todo!() + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.get_unique_name()) } } impl PackageInterface for RootPackage { fn get_name(&self) -> &str { - todo!() + self.inner.get_name() } fn get_pretty_name(&self) -> &str { - todo!() + self.inner.get_pretty_name() } - fn get_names(&self, _provides: bool) -> Vec<String> { - todo!() + fn get_names(&self, provides: bool) -> Vec<String> { + self.inner.get_names(provides) } - fn set_id(&mut self, _id: i64) { - todo!() + fn set_id(&mut self, id: i64) { + self.inner.set_id(id); } fn get_id(&self) -> i64 { - todo!() + self.inner.get_id() } fn is_dev(&self) -> bool { - todo!() + self.inner.is_dev() } fn get_type(&self) -> &str { - todo!() + self.inner.get_type() } - fn get_target_dir(&self) -> Option<&str> { - todo!() + fn get_target_dir(&self) -> Option<String> { + self.inner.get_target_dir() } fn get_extra(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.inner.get_extra() } - fn set_installation_source(&mut self, _type: Option<String>) { - todo!() + fn set_installation_source(&mut self, r#type: Option<String>) { + self.inner.set_installation_source(r#type); } fn get_installation_source(&self) -> Option<&str> { - todo!() + self.inner.get_installation_source() } fn get_source_type(&self) -> Option<&str> { - todo!() + self.inner.get_source_type() } fn get_source_url(&self) -> Option<&str> { - todo!() + self.inner.get_source_url() } fn get_source_urls(&self) -> Vec<String> { - todo!() + self.inner.get_source_urls() } fn get_source_reference(&self) -> Option<&str> { - todo!() + self.inner.get_source_reference() } - fn get_source_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> { - todo!() + fn get_source_mirrors(&self) -> Option<Vec<Mirror>> { + self.inner.get_source_mirrors() } - fn set_source_mirrors(&mut self, _mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) { - todo!() + fn set_source_mirrors(&mut self, mirrors: Option<Vec<Mirror>>) { + self.inner.set_source_mirrors(mirrors); } fn get_dist_type(&self) -> Option<&str> { - todo!() + self.inner.get_dist_type() } fn get_dist_url(&self) -> Option<&str> { - todo!() + self.inner.get_dist_url() } fn get_dist_urls(&self) -> Vec<String> { - todo!() + self.inner.get_dist_urls() } fn get_dist_reference(&self) -> Option<&str> { - todo!() + self.inner.get_dist_reference() } fn get_dist_sha1_checksum(&self) -> Option<&str> { - todo!() + self.inner.get_dist_sha1_checksum() } - fn get_dist_mirrors(&self) -> Option<Vec<IndexMap<String, PhpMixed>>> { - todo!() + fn get_dist_mirrors(&self) -> Option<Vec<Mirror>> { + self.inner.get_dist_mirrors() } - fn set_dist_mirrors(&mut self, _mirrors: Option<Vec<IndexMap<String, PhpMixed>>>) { - todo!() + fn set_dist_mirrors(&mut self, mirrors: Option<Vec<Mirror>>) { + self.inner.set_dist_mirrors(mirrors); } fn get_version(&self) -> &str { - todo!() + self.inner.get_version() } fn get_pretty_version(&self) -> &str { - todo!() + self.inner.get_pretty_version() } - fn get_full_pretty_version(&self, _truncate: bool, _display_mode: i64) -> String { - todo!() + fn get_full_pretty_version(&self, truncate: bool, display_mode: DisplayMode) -> String { + self.inner.get_full_pretty_version(truncate, display_mode) } fn get_release_date(&self) -> Option<DateTime<Utc>> { - todo!() + self.inner.get_release_date() } fn get_stability(&self) -> &str { - todo!() + self.inner.get_stability() } fn get_requires(&self) -> IndexMap<String, Link> { - todo!() + self.inner.get_requires() } fn get_conflicts(&self) -> IndexMap<String, Link> { - todo!() + self.inner.get_conflicts() } fn get_provides(&self) -> IndexMap<String, Link> { - todo!() + self.inner.get_provides() } fn get_replaces(&self) -> IndexMap<String, Link> { - todo!() + self.inner.get_replaces() } fn get_dev_requires(&self) -> IndexMap<String, Link> { - todo!() + self.inner.get_dev_requires() } fn get_suggests(&self) -> IndexMap<String, String> { - todo!() + self.inner.get_suggests() } fn get_autoload(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.inner.get_autoload() } fn get_dev_autoload(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.inner.get_dev_autoload() } fn get_include_paths(&self) -> Vec<String> { - todo!() + self.inner.get_include_paths() } fn get_php_ext(&self) -> Option<IndexMap<String, PhpMixed>> { - todo!() + self.inner.get_php_ext() } fn set_repository(&mut self, repository: RepositoryInterfaceHandle) -> anyhow::Result<()> { self.inner.set_repository(repository) @@ -358,42 +360,42 @@ impl PackageInterface for RootPackage { self.inner.get_repository() } fn get_binaries(&self) -> Vec<String> { - todo!() + self.inner.get_binaries() } fn get_unique_name(&self) -> String { - todo!() + self.inner.get_unique_name() } fn get_notification_url(&self) -> Option<&str> { - todo!() + self.inner.get_notification_url() } fn get_pretty_string(&self) -> String { - todo!() + self.inner.get_pretty_string() } fn is_default_branch(&self) -> bool { - todo!() + self.inner.is_default_branch() } fn get_transport_options(&self) -> IndexMap<String, PhpMixed> { - todo!() + self.inner.get_transport_options() } - fn set_transport_options(&mut self, _options: IndexMap<String, PhpMixed>) { - todo!() + fn set_transport_options(&mut self, options: IndexMap<String, PhpMixed>) { + self.inner.set_transport_options(options); } - fn set_source_reference(&mut self, _reference: Option<String>) { - todo!() + fn set_source_reference(&mut self, reference: Option<String>) { + self.inner.set_source_reference(reference); } - fn set_source_url(&mut self, _url: Option<String>) { - todo!() + fn set_source_url(&mut self, url: Option<String>) { + self.inner.set_source_url(url); } - fn set_dist_url(&mut self, _url: Option<String>) { - todo!() + fn set_dist_url(&mut self, url: Option<String>) { + self.inner.set_dist_url(url); } - fn set_dist_type(&mut self, _type: Option<String>) { - todo!() + fn set_dist_type(&mut self, r#type: Option<String>) { + self.inner.set_dist_type(r#type); } - fn set_dist_reference(&mut self, _reference: Option<String>) { - todo!() + fn set_dist_reference(&mut self, reference: Option<String>) { + self.inner.set_dist_reference(reference); } - fn set_source_dist_references(&mut self, _reference: &str) { - todo!() + fn set_source_dist_references(&mut self, reference: &str) { + self.inner.set_source_dist_references(reference); } } diff --git a/crates/shirabe/src/package/root_package_interface.rs b/crates/shirabe/src/package/root_package_interface.rs index 5f47232..aa2534a 100644 --- a/crates/shirabe/src/package/root_package_interface.rs +++ b/crates/shirabe/src/package/root_package_interface.rs @@ -21,15 +21,15 @@ pub trait RootPackageInterface: CompletePackageInterface { fn get_config(&self) -> &IndexMap<String, PhpMixed>; - fn set_requires(&mut self, requires: Vec<Link>); + fn set_requires(&mut self, requires: IndexMap<String, Link>); - fn set_dev_requires(&mut self, dev_requires: Vec<Link>); + fn set_dev_requires(&mut self, dev_requires: IndexMap<String, Link>); - fn set_conflicts(&mut self, conflicts: Vec<Link>); + fn set_conflicts(&mut self, conflicts: IndexMap<String, Link>); - fn set_provides(&mut self, provides: Vec<Link>); + fn set_provides(&mut self, provides: IndexMap<String, Link>); - fn set_replaces(&mut self, replaces: Vec<Link>); + fn set_replaces(&mut self, replaces: IndexMap<String, Link>); fn set_autoload(&mut self, autoload: IndexMap<String, PhpMixed>); diff --git a/crates/shirabe/src/repository/composer_repository.rs b/crates/shirabe/src/repository/composer_repository.rs index 1f2fcbf..9e5e48c 100644 --- a/crates/shirabe/src/repository/composer_repository.rs +++ b/crates/shirabe/src/repository/composer_repository.rs @@ -2772,26 +2772,22 @@ impl ComposerRepository { if let Some(mirrors) = self.source_mirrors.as_ref().and_then(|m| m.get(&src_type)) { - let converted: Vec<IndexMap<String, PhpMixed>> = mirrors + let converted: Vec<crate::package::Mirror> = mirrors .iter() - .map(|m| { - let mut im: IndexMap<String, PhpMixed> = IndexMap::new(); - im.insert("url".to_string(), PhpMixed::String(m.url.clone())); - im.insert("preferred".to_string(), PhpMixed::Bool(m.preferred)); - im + .map(|m| crate::package::Mirror { + url: m.url.clone(), + preferred: m.preferred, }) .collect(); package.set_source_mirrors(Some(converted)); } } if let Some(dist_mirrors) = self.dist_mirrors.as_ref() { - let converted: Vec<IndexMap<String, PhpMixed>> = dist_mirrors + let converted: Vec<crate::package::Mirror> = dist_mirrors .iter() - .map(|m| { - let mut im: IndexMap<String, PhpMixed> = IndexMap::new(); - im.insert("url".to_string(), PhpMixed::String(m.url.clone())); - im.insert("preferred".to_string(), PhpMixed::Bool(m.preferred)); - im + .map(|m| crate::package::Mirror { + url: m.url.clone(), + preferred: m.preferred, }) .collect(); package.set_dist_mirrors(Some(converted)); |
