From a3ba3cd51175a1de0c99ac92419ada3f28fc04e5 Mon Sep 17 00:00:00 2001 From: Daan Boerlage Date: Tue, 21 Jan 2025 17:40:48 +0100 Subject: [PATCH 1/4] Capture additional fields on the list command --- src/cmd/list.rs | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/cmd/list.rs b/src/cmd/list.rs index de120d3..36142bb 100644 --- a/src/cmd/list.rs +++ b/src/cmd/list.rs @@ -2,17 +2,25 @@ use crate::jira_config::JiraConfig; use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE}; use serde::{Deserialize, Serialize}; -#[derive(Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize)] struct JiraIssue { key: String, + #[serde(rename = "self")] + href: String, fields: JiraIssueResponseFields, } -#[derive(Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize)] struct JiraIssueResponseFields { summary: String, status: Status, - created: String, + created: chrono::DateTime, + priority: Priority, + assignee: Person, + reporter: Person, + creator: Person, + #[serde(rename = "duedate")] + due_date: Option, } #[derive(Deserialize)] @@ -21,11 +29,29 @@ struct JiraSearchResponse { total: u32, } -#[derive(Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize)] struct Status { name: String, } +#[derive(Debug, Deserialize, Serialize)] +struct Priority { + name: String, + id: String, +} + +#[derive(Debug, Deserialize, Serialize)] +struct Person { + #[serde(rename = "self")] + href: String, + #[serde(rename = "displayName")] + display_name: String, + #[serde(rename = "accountId")] + account_id: String, + #[serde(rename = "emailAddress")] + email_address: String, +} + async fn list_jira_issues( config: &JiraConfig, ) -> Result> { From 6a2157623656fba29327a2e673f0a5fb10c2b7fb Mon Sep 17 00:00:00 2001 From: Daan Boerlage Date: Tue, 21 Jan 2025 17:41:41 +0100 Subject: [PATCH 2/4] Use tabwriter to pretty print the list response --- Cargo.lock | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 4 ++- src/cmd/list.rs | 23 +++++++++---- 3 files changed, 107 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8207c42..ba9d308 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,6 +29,21 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.18" @@ -180,6 +195,21 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets", +] + [[package]] name = "clap" version = "4.5.27" @@ -665,6 +695,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "1.5.0" @@ -855,6 +908,7 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" name = "jirac" version = "0.1.0" dependencies = [ + "chrono", "clap", "config", "directories", @@ -863,6 +917,7 @@ dependencies = [ "reqwest", "serde", "serde_json", + "tabwriter", "tempfile", "tokio", "toml 0.8.19", @@ -982,6 +1037,15 @@ dependencies = [ "tempfile", ] +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.36.7" @@ -1574,6 +1638,15 @@ dependencies = [ "libc", ] +[[package]] +name = "tabwriter" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce91f2f0ec87dff7e6bcbbeb267439aa1188703003c6055193c821487400432" +dependencies = [ + "unicode-width", +] + [[package]] name = "tempfile" version = "3.15.0" @@ -1814,6 +1887,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "untrusted" version = "0.9.0" @@ -1957,6 +2036,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-registry" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index e4712c7..f3da48c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,4 +15,6 @@ config = "0.15" directories = "6.0" tempfile = "3.8" gray_matter = { version = "0.2", default-features = false, features = ["toml"] } -open = "5.2" \ No newline at end of file +open = "5.2" +chrono = { version = "0.4", features = ["serde"] } +tabwriter = "1.4" \ No newline at end of file diff --git a/src/cmd/list.rs b/src/cmd/list.rs index 36142bb..dce885a 100644 --- a/src/cmd/list.rs +++ b/src/cmd/list.rs @@ -1,6 +1,7 @@ use crate::jira_config::JiraConfig; use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE}; use serde::{Deserialize, Serialize}; +use std::io::Write; #[derive(Debug, Deserialize, Serialize)] struct JiraIssue { @@ -81,18 +82,26 @@ async fn list_jira_issues( Ok(response.json::().await?) } -fn display_issues_pretty(issues: &[JiraIssue], jira_url: &str) { +fn display_issues_pretty(issues: &[JiraIssue]) -> Result<(), Box> { println!("Found {} issues:", issues.len()); println!("{:-<80}", ""); for issue in issues { - println!("Key: {}", issue.key); - println!("Summary: {}", issue.fields.summary); - println!("Status: {}", issue.fields.status.name); - println!("Created: {}", issue.fields.created); - println!("URL: {}/browse/{}", jira_url, issue.key); + let mut tw = tabwriter::TabWriter::new(vec![]); + writeln!(tw, "Key:\t{}", issue.key)?; + writeln!(tw, "Summary:\t{}", issue.fields.summary)?; + writeln!(tw, "Status:\t{}", issue.fields.status.name)?; + writeln!(tw, "Created:\t{}", issue.fields.created)?; + writeln!(tw, "Due Date:\t{:?}", issue.fields.due_date)?; + writeln!(tw, "URL:\t{}", issue.href)?; + tw.flush().unwrap(); + + let written = String::from_utf8(tw.into_inner().unwrap()).unwrap(); + println!("{}", written); println!("{:-<80}", ""); } + + Ok(()) } fn display_issues_json(issues: &[JiraIssue]) -> Result<(), Box> { @@ -118,7 +127,7 @@ pub async fn list(json: bool) -> Result<(), Box> { } else if response.issues.is_empty() { println!("No open issues found for assigned to you"); } else { - display_issues_pretty(&response.issues, &config.url); + display_issues_pretty(&response.issues)?; println!("Total issues: {}", response.total); } } From e774f835268ae519ed40f3eefbe6cde05c26a952 Mon Sep 17 00:00:00 2001 From: Daan Boerlage Date: Tue, 21 Jan 2025 17:41:50 +0100 Subject: [PATCH 3/4] cargo fmt --- src/cmd/create.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cmd/create.rs b/src/cmd/create.rs index 6d3b289..024e2c7 100644 --- a/src/cmd/create.rs +++ b/src/cmd/create.rs @@ -269,19 +269,19 @@ async fn create_jira_issue( .json(&issue) .send() .await?; - + if !response.status().is_success() { let error_text = response.text().await?; return Err(format!("Failed to create issue: {}", error_text).into()); } - + let issue_response = response.json::().await?; - + // Update status if specified (requires a separate API call) if let Some(status) = &metadata.status { update_issue_status(config, &issue_response.key, status).await?; } - + Ok(issue_response) } From 86fe96f0cde83ee98fb5ecaad492cfe319ff2925 Mon Sep 17 00:00:00 2001 From: Daan Boerlage Date: Tue, 21 Jan 2025 17:46:00 +0100 Subject: [PATCH 4/4] Add some color --- Cargo.lock | 17 +++++++++++++++++ Cargo.toml | 2 +- src/cmd/list.rs | 15 ++++++++------- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba9d308..90244e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,6 +256,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + [[package]] name = "config" version = "0.15.6" @@ -910,6 +920,7 @@ version = "0.1.0" dependencies = [ "chrono", "clap", + "colored", "config", "directories", "gray_matter", @@ -944,6 +955,12 @@ dependencies = [ "serde", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.169" diff --git a/Cargo.toml b/Cargo.toml index f3da48c..0efb1d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ reqwest = { version = "0.12", features = ["json"] } tokio = { version = "1.0", features = ["full"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -#colored = "2.0" +colored = "2.0" toml = "0.8" config = "0.15" directories = "6.0" diff --git a/src/cmd/list.rs b/src/cmd/list.rs index dce885a..aa50486 100644 --- a/src/cmd/list.rs +++ b/src/cmd/list.rs @@ -1,4 +1,5 @@ use crate::jira_config::JiraConfig; +use colored::Colorize; use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE}; use serde::{Deserialize, Serialize}; use std::io::Write; @@ -88,16 +89,16 @@ fn display_issues_pretty(issues: &[JiraIssue]) -> Result<(), Box