From 06e8e14520a4a38fed500581d2b75a42418b22c4 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 4 Jun 2026 21:09:02 +0900 Subject: 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 (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, 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 (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 --- crates/shirabe/src/package/base_package.rs | 31 +++++++++++------------------- 1 file changed, 11 insertions(+), 20 deletions(-) (limited to 'crates/shirabe/src/package/base_package.rs') 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 { - const DISPLAY_SOURCE_REF_IF_DEV: i64 = ::DISPLAY_SOURCE_REF_IF_DEV; - const DISPLAY_SOURCE_REF: i64 = ::DISPLAY_SOURCE_REF; - const DISPLAY_DIST_REF: i64 = ::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 { -- cgit v1.3.1