108 lines
3.3 KiB
Rust
108 lines
3.3 KiB
Rust
use crate::cli::FormatMode;
|
|
use crate::jira_config::JiraConfig;
|
|
use crate::renderer::hyperlink;
|
|
use crossterm::style::{Color, Stylize};
|
|
use libjirac::client::commands::SearchCommand;
|
|
use libjirac::client::JiraClient;
|
|
use libjirac::entities::issue::JiraIssue;
|
|
use std::io::Write;
|
|
|
|
pub fn display_issues_pretty(issues: &[JiraIssue]) -> Result<(), Box<dyn std::error::Error>> {
|
|
println!("Found {} issues:", issues.len());
|
|
println!("{:-<80}", "");
|
|
|
|
for issue in issues {
|
|
let mut tw = tabwriter::TabWriter::new(vec![]);
|
|
writeln!(tw, "{}:\t{}", "Key".blue(), issue.key)?;
|
|
writeln!(tw, "{}:\t{}", "Summary".blue(), issue.fields.summary)?;
|
|
writeln!(tw, "{}:\t{}", "Status".blue(), issue.fields.status.name)?;
|
|
writeln!(
|
|
tw,
|
|
"{}:\t{}",
|
|
"Created".blue(),
|
|
issue.fields.created.with_timezone(&chrono::Local)
|
|
)?;
|
|
writeln!(
|
|
tw,
|
|
"{}:\t{}",
|
|
"Due Date".blue(),
|
|
match issue.fields.due_date {
|
|
None => "None".to_string(),
|
|
Some(x) => x.to_string(),
|
|
}
|
|
)?;
|
|
writeln!(
|
|
tw,
|
|
"{}",
|
|
&hyperlink(&issue.href, &"Open Issue".green().to_string())
|
|
)?;
|
|
|
|
tw.flush().unwrap();
|
|
|
|
let written = String::from_utf8(tw.into_inner().unwrap()).unwrap();
|
|
print!("{}", written);
|
|
println!("{:-<80}", "");
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
pub fn display_issues_compact(issues: &[JiraIssue]) -> Result<(), Box<dyn std::error::Error>> {
|
|
println!("Found {} issues:", issues.len());
|
|
println!("{:-<80}", "");
|
|
|
|
let mut tw = tabwriter::TabWriter::new(vec![]);
|
|
for issue in issues {
|
|
writeln!(
|
|
tw,
|
|
"{}:\t{}",
|
|
hyperlink(
|
|
&issue.href,
|
|
&issue.key.clone().blue().underline(Color::Blue).to_string()
|
|
),
|
|
issue.fields.summary.clone().green()
|
|
)?;
|
|
}
|
|
|
|
tw.flush().unwrap();
|
|
let written = String::from_utf8(tw.into_inner().unwrap()).unwrap();
|
|
print!("{}", written);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
pub fn display_issues_json(issues: &[JiraIssue]) -> Result<(), Box<dyn std::error::Error>> {
|
|
let j = serde_json::to_string_pretty(issues)?;
|
|
println!("{}", j);
|
|
Ok(())
|
|
}
|
|
|
|
pub async fn exec(output: FormatMode, jql: &str) -> Result<(), Box<dyn std::error::Error>> {
|
|
let config = JiraConfig::load().map_err(|e| format!("Configuration error: {}", e))?;
|
|
if output != FormatMode::Json {
|
|
println!("Searching for issues...");
|
|
}
|
|
|
|
let client = JiraClient::from(&config);
|
|
|
|
let jql_cmd = SearchCommand::new(jql);
|
|
let result = client.exec(jql_cmd).await?;
|
|
|
|
match (output, result.issues.is_empty()) {
|
|
(FormatMode::Pretty, false) => {
|
|
display_issues_pretty(&result.issues)?;
|
|
println!("Total issues: {}", result.total);
|
|
}
|
|
(FormatMode::Pretty, true) => {
|
|
println!("No results found for query.");
|
|
}
|
|
(FormatMode::Json, false) => display_issues_json(&result.issues)?,
|
|
(FormatMode::Json, true) => println!("[]"),
|
|
(FormatMode::Compact, false) => display_issues_compact(&result.issues)?,
|
|
(FormatMode::Compact, true) => {
|
|
println!("No results found for query.");
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|