Use tabwriter to pretty print the list response

This commit is contained in:
Daan Boerlage 2025-01-21 17:41:41 +01:00
parent a3ba3cd511
commit 6a21576236
Signed by: daan
GPG key ID: FCE070E1E4956606
3 changed files with 107 additions and 8 deletions

88
Cargo.lock generated
View file

@ -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"

View file

@ -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"
open = "5.2"
chrono = { version = "0.4", features = ["serde"] }
tabwriter = "1.4"

View file

@ -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::<JiraSearchResponse>().await?)
}
fn display_issues_pretty(issues: &[JiraIssue], jira_url: &str) {
fn display_issues_pretty(issues: &[JiraIssue]) -> Result<(), Box<dyn std::error::Error>> {
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<dyn std::error::Error>> {
@ -118,7 +127,7 @@ pub async fn list(json: bool) -> Result<(), Box<dyn std::error::Error>> {
} 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);
}
}