aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package/base_package.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-04 21:09:02 +0900
committernsfisis <nsfisis@gmail.com>2026-06-04 21:09:02 +0900
commit06e8e14520a4a38fed500581d2b75a42418b22c4 (patch)
tree573af18bf6e0933488aea9c1bac47bf4e857546d /crates/shirabe/src/package/base_package.rs
parenta9f19862350c6fd3592d93515d869ffe07ecb399 (diff)
downloadphp-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/package/base_package.rs')
-rw-r--r--crates/shirabe/src/package/base_package.rs31
1 files changed, 11 insertions, 20 deletions
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 {