From 0d244cf80d75a6a310aa96233873627c923455cd Mon Sep 17 00:00:00 2001 From: Daan Boerlage Date: Tue, 21 Jan 2025 16:04:53 +0100 Subject: [PATCH] Add support for printing json on the list command --- Cargo.lock | 1 + Cargo.toml | 2 +- readme.md | 3 ++- src/cli.rs | 5 ++++- src/cmd/list.rs | 32 +++++++++++++++++++++++--------- src/main.rs | 2 +- 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ca3ea95..8c0c2ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -830,6 +830,7 @@ dependencies = [ "directories", "reqwest", "serde", + "serde_json", "tempfile", "tokio", "toml", diff --git a/Cargo.toml b/Cargo.toml index 56d49ff..b5268c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ clap = { version = "4.4", features = ["derive"] } reqwest = { version = "0.12", features = ["json"] } tokio = { version = "1.0", features = ["full"] } serde = { version = "1.0", features = ["derive"] } -#serde_json = "1.0" +serde_json = "1.0" #colored = "2.0" toml = "0.8" config = "0.15" diff --git a/readme.md b/readme.md index 24bc0b8..962adc9 100644 --- a/readme.md +++ b/readme.md @@ -62,9 +62,10 @@ jirac create --project KEY ticket.md ## Listing tickets ``` -Usage: jirac list +Usage: jirac list [OPTIONS] Options: + --json -h, --help Print help ``` diff --git a/src/cli.rs b/src/cli.rs index 98b38d7..aef9bfa 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -17,7 +17,10 @@ pub enum Commands { #[arg(value_name = "MARKDOWN_FILE")] markdown_file: Option, }, - List, + List { + #[arg(long)] + json: bool, + }, Init { #[arg(long)] url: String, diff --git a/src/cmd/list.rs b/src/cmd/list.rs index 7b11f10..de120d3 100644 --- a/src/cmd/list.rs +++ b/src/cmd/list.rs @@ -1,14 +1,14 @@ use crate::jira_config::JiraConfig; use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE}; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; -#[derive(Deserialize)] +#[derive(Deserialize, Serialize)] struct JiraIssue { key: String, fields: JiraIssueResponseFields, } -#[derive(Deserialize)] +#[derive(Deserialize, Serialize)] struct JiraIssueResponseFields { summary: String, status: Status, @@ -21,7 +21,7 @@ struct JiraSearchResponse { total: u32, } -#[derive(Deserialize)] +#[derive(Deserialize, Serialize)] struct Status { name: String, } @@ -55,7 +55,7 @@ async fn list_jira_issues( Ok(response.json::().await?) } -fn display_issues(issues: &[JiraIssue], jira_url: &str) { +fn display_issues_pretty(issues: &[JiraIssue], jira_url: &str) { println!("Found {} issues:", issues.len()); println!("{:-<80}", ""); @@ -69,16 +69,30 @@ fn display_issues(issues: &[JiraIssue], jira_url: &str) { } } -pub async fn list() -> Result<(), Box> { +fn display_issues_json(issues: &[JiraIssue]) -> Result<(), Box> { + let j = serde_json::to_string_pretty(issues)?; + println!("{}", j); + Ok(()) +} + +pub async fn list(json: bool) -> Result<(), Box> { let config = JiraConfig::load().map_err(|e| format!("Configuration error: {}", e))?; - println!("Fetching issues assigned..."); + if !json { + println!("Fetching issues assigned..."); + } match list_jira_issues(&config).await { Ok(response) => { - if response.issues.is_empty() { + if json { + if response.issues.is_empty() { + println!("[]"); + } else { + display_issues_json(&response.issues)?; + } + } else if response.issues.is_empty() { println!("No open issues found for assigned to you"); } else { - display_issues(&response.issues, &config.url); + display_issues_pretty(&response.issues, &config.url); println!("Total issues: {}", response.total); } } diff --git a/src/main.rs b/src/main.rs index 96225a2..0e8d145 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,7 @@ async fn main() -> Result<(), Box> { project, markdown_file, } => cmd::create::create(project, markdown_file).await?, - Commands::List => cmd::list::list().await?, + Commands::List { json } => cmd::list::list(json).await?, Commands::Init { url, email, token } => { JiraConfig::init(url, email, token).await?; println!("Configuration initialized successfully!");