jirac/crates/jirac/src/cmd/search.rs

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(())
}