jira_cli/commands/
projects.rs1use owo_colors::OwoColorize;
2
3use crate::api::{ApiError, JiraClient};
4use crate::output::{OutputConfig, use_color};
5
6pub async fn list(client: &JiraClient, out: &OutputConfig) -> Result<(), ApiError> {
7 let projects = client.list_projects().await?;
8
9 if out.json {
10 out.print_data(
11 &serde_json::to_string_pretty(&serde_json::json!({
12 "total": projects.len(),
13 "projects": projects.iter().map(|p| serde_json::json!({
14 "key": p.key,
15 "name": p.name,
16 "id": p.id,
17 "type": p.project_type,
18 })).collect::<Vec<_>>(),
19 }))
20 .expect("failed to serialize JSON"),
21 );
22 } else {
23 if projects.is_empty() {
24 out.print_message("No projects found.");
25 return Ok(());
26 }
27
28 let color = use_color();
29 let key_w = projects
30 .iter()
31 .map(|p| p.key.len())
32 .max()
33 .unwrap_or(3)
34 .max(3)
35 + 2;
36 let name_w = projects
37 .iter()
38 .map(|p| p.name.len())
39 .max()
40 .unwrap_or(4)
41 .max(4)
42 + 2;
43
44 let header = format!("{:<key_w$} {:<name_w$} {}", "Key", "Name", "Type");
45 if color {
46 println!("{}", header.bold());
47 } else {
48 println!("{header}");
49 }
50
51 for p in &projects {
52 let ptype = p.project_type.as_deref().unwrap_or("-");
53 if color {
54 println!(
55 "{} {:<name_w$} {}",
56 format!("{:<key_w$}", p.key).yellow(),
57 p.name,
58 ptype,
59 );
60 } else {
61 println!("{:<key_w$} {:<name_w$} {}", p.key, p.name, ptype);
62 }
63 }
64 out.print_message(&format!("{} projects", projects.len()));
65 }
66 Ok(())
67}
68
69pub async fn show(client: &JiraClient, out: &OutputConfig, key: &str) -> Result<(), ApiError> {
70 let project = client.get_project(key).await?;
71
72 if out.json {
73 out.print_data(
74 &serde_json::to_string_pretty(&serde_json::json!({
75 "key": project.key,
76 "name": project.name,
77 "id": project.id,
78 "type": project.project_type,
79 }))
80 .expect("failed to serialize JSON"),
81 );
82 } else {
83 let color = use_color();
84 let key_str = if color {
85 project.key.yellow().bold().to_string()
86 } else {
87 project.key.clone()
88 };
89 println!("{key_str} {}", project.name);
90 println!(" ID: {}", project.id);
91 if let Some(ref t) = project.project_type {
92 println!(" Type: {t}");
93 }
94 }
95 Ok(())
96}