pakker-cli: add some color to pakker ls

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Iaac69f7b97115154875ef4ac3949cfae6a6a6964
This commit is contained in:
raf 2026-05-03 20:48:37 +03:00
commit 6ffcfb5af6
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF

View file

@ -1,5 +1,7 @@
use std::path::Path; use std::path::Path;
use yansi::Paint;
use crate::{cli::LsArgs, error::Result, model::LockFile}; use crate::{cli::LsArgs, error::Result, model::LockFile};
/// Truncate a name to fit within `max_len` characters, adding "..." if /// Truncate a name to fit within `max_len` characters, adding "..." if
@ -20,11 +22,15 @@ pub fn execute(args: &LsArgs, lockfile_path: &Path) -> Result<()> {
let lockfile = LockFile::load(lockfile_dir)?; let lockfile = LockFile::load(lockfile_dir)?;
if lockfile.projects.is_empty() { if lockfile.projects.is_empty() {
println!("No projects installed"); println!("{}", "No projects installed".yellow());
return Ok(()); return Ok(());
} }
println!("Installed projects ({}):", lockfile.projects.len()); println!(
"{} ({})",
"Installed projects".bold(),
lockfile.projects.len().to_string().cyan().bold()
);
println!(); println!();
// Calculate max name length for alignment // Calculate max name length for alignment
@ -53,28 +59,39 @@ pub fn execute(args: &LsArgs, lockfile_path: &Path) -> Result<()> {
if args.detailed { if args.detailed {
let id = project.pakku_id.as_deref().unwrap_or("unknown"); let id = project.pakku_id.as_deref().unwrap_or("unknown");
let name = truncate_name(&project.get_name(), max_name_len); let name = truncate_name(&project.get_name(), max_name_len);
println!(" {name} ({id}){version_warning}"); let name_line = format!(" {name} ({id})");
println!(" Type: {:?}", project.r#type); if version_warning.is_empty() {
println!(" Side: {:?}", project.side); println!("{}", name_line.bold());
} else {
println!("{}{}", name_line.bold(), version_warning.yellow());
}
println!(" {} {:?}", "Type:".dim(), project.r#type);
println!(" {} {:?}", "Side:".dim(), project.side);
if let Some(file) = project.files.first() { if let Some(file) = project.files.first() {
println!(" File: {}", file.file_name); println!(" {} {}", "File:".dim(), file.file_name);
println!( println!(
" Version: {} ({})", " {} {} ({})",
file.release_type, file.date_published "Version:".dim(),
file.release_type,
file.date_published
); );
} }
// Show version details if there's a mismatch // Show version details if there's a mismatch
if !version_warning.is_empty() { if !version_warning.is_empty() {
println!(" Provider versions:"); println!(" {}:", "Provider versions".dim());
for file in &project.files { for file in &project.files {
println!(" {}: {}", file.file_type, file.file_name); println!(" {}: {}", file.file_type, file.file_name);
} }
} }
if !project.pakku_links.is_empty() { if !project.pakku_links.is_empty() {
println!(" Dependencies: {}", project.pakku_links.len()); println!(
" {} {}",
"Dependencies:".dim(),
project.pakku_links.len()
);
} }
println!(); println!();
@ -86,7 +103,12 @@ pub fn execute(args: &LsArgs, lockfile_path: &Path) -> Result<()> {
.map(|f| format!(" ({})", f.file_name)) .map(|f| format!(" ({})", f.file_name))
.unwrap_or_default(); .unwrap_or_default();
println!(" {name}{file_info}{version_warning}"); println!(
" {}{}{}",
name.bold(),
file_info.dim(),
version_warning.yellow()
);
} }
} }