Skip to main content

git_claw/cli/
output.rs

1//! Terminal output and presentation formatting helpers.
2
3use colored::*;
4use std::fmt::Display;
5
6/// Model for rendering active worktree table rows.
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct WorktreeRow {
9    pub slot: u32,
10    pub branch: String,
11    pub path: String,
12    pub ports: String,
13    pub commit: String,
14}
15
16/// Print an error message to stderr with red prefix.
17pub fn print_error<T: Display>(msg: T) {
18    eprintln!("{} {}", "error:".red().bold(), msg);
19}
20
21/// Print a warning message to stderr with yellow prefix.
22#[allow(dead_code)]
23pub fn print_warning<T: Display>(msg: T) {
24    eprintln!("{} {}", "warning:".yellow().bold(), msg);
25}
26
27/// Print a success message to stdout with green prefix.
28#[allow(dead_code)]
29pub fn print_success<T: Display>(msg: T) {
30    println!("{} {}", "success:".green().bold(), msg);
31}
32
33/// Prints the active worktree slots in an aligned ASCII table.
34pub fn print_worktree_table(rows: &[WorktreeRow]) {
35    if rows.is_empty() {
36        println!("No active worktrees found.");
37        return;
38    }
39
40    let slot_header = "SLOT";
41    let branch_header = "BRANCH";
42    let path_header = "DIRECTORY";
43    let ports_header = "PORTS";
44    let commit_header = "COMMIT";
45
46    let slot_w = rows
47        .iter()
48        .map(|r| r.slot.to_string().len())
49        .max()
50        .unwrap_or(0)
51        .max(slot_header.len());
52
53    let branch_w = rows
54        .iter()
55        .map(|r| r.branch.len())
56        .max()
57        .unwrap_or(0)
58        .max(branch_header.len());
59
60    let path_w = rows
61        .iter()
62        .map(|r| r.path.len())
63        .max()
64        .unwrap_or(0)
65        .max(path_header.len());
66
67    let ports_w = rows
68        .iter()
69        .map(|r| r.ports.len())
70        .max()
71        .unwrap_or(0)
72        .max(ports_header.len());
73
74    let commit_w = rows
75        .iter()
76        .map(|r| r.commit.len())
77        .max()
78        .unwrap_or(0)
79        .max(commit_header.len());
80
81    println!(
82        "{:<slot_w$}  {:<branch_w$}  {:<path_w$}  {:<ports_w$}  {:<commit_w$}",
83        slot_header.bold(),
84        branch_header.bold(),
85        path_header.bold(),
86        ports_header.bold(),
87        commit_header.bold(),
88    );
89
90    for r in rows {
91        println!(
92            "{:<slot_w$}  {:<branch_w$}  {:<path_w$}  {:<ports_w$}  {:<commit_w$}",
93            r.slot.to_string().cyan(),
94            r.branch.green(),
95            r.path,
96            r.ports.yellow(),
97            r.commit.bright_black(),
98        );
99    }
100}