1use colored::*;
4use std::fmt::Display;
5
6#[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
16pub fn print_error<T: Display>(msg: T) {
18 eprintln!("{} {}", "error:".red().bold(), msg);
19}
20
21#[allow(dead_code)]
23pub fn print_warning<T: Display>(msg: T) {
24 eprintln!("{} {}", "warning:".yellow().bold(), msg);
25}
26
27#[allow(dead_code)]
29pub fn print_success<T: Display>(msg: T) {
30 println!("{} {}", "success:".green().bold(), msg);
31}
32
33pub 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}