Skip to main content

jira_cli/commands/
projects.rs

1use 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}