From 004f507020ada18b6830de6e7323fb5037d68882 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sat, 8 Aug 2026 12:39:54 +0800 Subject: feat(pkg-show): return early error for empty packages Add dedicated error renderer for "No packages installed" and return it early instead of rendering empty package list. --- mingling_cli/src/pkg_mgr/cmd_pkg_show.rs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'mingling_cli/src') diff --git a/mingling_cli/src/pkg_mgr/cmd_pkg_show.rs b/mingling_cli/src/pkg_mgr/cmd_pkg_show.rs index 68aef2b..88c79ef 100644 --- a/mingling_cli/src/pkg_mgr/cmd_pkg_show.rs +++ b/mingling_cli/src/pkg_mgr/cmd_pkg_show.rs @@ -2,13 +2,13 @@ use std::{collections::BTreeMap, fs, io}; use colored::Colorize; use mingling::{ - Grouped, Routable, - macros::{buffer, command, metadata, r_println, renderer, routeify}, + Grouped, RenderResult, Routable, + macros::{buffer, command, metadata, pack_err, r_println, renderer, routeify}, metadata::Description, }; use crate::{ - Next, + Next, eprintln_cargo, pkg_mgr::{ErrorNoDataDirectory, ResPackagesDir}, }; @@ -31,6 +31,8 @@ pub fn desc_pkg_show() -> Description { "Show locally installed packages".into() } +pack_err!(ErrorNoPackagesInstalled); + #[command(node = "pkg-show", routeify)] pub fn package_show(packages_dir: &ResPackagesDir) -> Next { let packages_dir = &packages_dir.path; @@ -79,17 +81,17 @@ pub fn package_show(packages_dir: &ResPackagesDir) -> Next { pkg.versions.sort_by(|a, b| compare_versions(b, a)); } - ResultPkgShow { - packages: entries.into_values().collect(), + let packages: Vec = entries.into_values().collect(); + + if packages.is_empty() { + return ErrorNoPackagesInstalled::default().into(); } - .to_chain() + + ResultPkgShow { packages }.to_chain() } #[renderer(buffer)] pub fn render_result_pkg_show(r: ResultPkgShow) { - if r.packages.is_empty() { - r_println!("No packages installed"); - } for pkg in r.packages { if let Some(enabled) = &pkg.enabled { r_println!("{}", format!("{} ({})", pkg.name, enabled).bright_cyan()); @@ -102,6 +104,13 @@ pub fn render_result_pkg_show(r: ResultPkgShow) { } } +#[renderer] +pub fn render_error_no_packages_installed(_: ErrorNoPackagesInstalled) -> RenderResult { + let mut r = RenderResult::new(); + eprintln_cargo!(r, "No packages installed"); + r +} + /// Newest first; unparsable versions sort last, compared lexicographically. fn compare_versions(a: &str, b: &str) -> std::cmp::Ordering { match (semver::Version::parse(a), semver::Version::parse(b)) { -- cgit