use clap::Args;
use monocle::lens::time::{TimeBgpTime, TimeLens, TimeParseArgs};
use monocle::utils::OutputFormat;
use tabled::settings::Style;
use tabled::Table;
#[derive(Args)]
pub struct TimeArgs {
#[clap()]
pub time: Vec<String>,
#[clap(short, long)]
pub simple: bool,
}
pub fn run(args: TimeArgs, output_format: OutputFormat) {
let TimeArgs { time, simple } = args;
let lens = TimeLens::new();
let parse_args = TimeParseArgs::new(time);
if simple {
match lens.parse_to_rfc3339(&parse_args.times) {
Ok(results) => {
for r in results {
println!("{}", r);
}
}
Err(e) => eprintln!("ERROR: {}", e),
}
return;
}
let results = match lens.parse(&parse_args) {
Ok(r) => r,
Err(e) => {
eprintln!("ERROR: {}", e);
return;
}
};
format_output(&results, output_format);
}
fn format_output(results: &[TimeBgpTime], output_format: OutputFormat) {
match output_format {
OutputFormat::Table => {
println!("{}", Table::new(results).with(Style::rounded()));
}
OutputFormat::Markdown => {
println!("{}", Table::new(results).with(Style::markdown()));
}
OutputFormat::Json => match serde_json::to_string(results) {
Ok(json) => println!("{}", json),
Err(e) => eprintln!("ERROR: Failed to serialize to JSON: {}", e),
},
OutputFormat::JsonPretty => match serde_json::to_string_pretty(results) {
Ok(json) => println!("{}", json),
Err(e) => eprintln!("ERROR: Failed to serialize to JSON: {}", e),
},
OutputFormat::JsonLine => {
for r in results {
match serde_json::to_string(r) {
Ok(json) => println!("{}", json),
Err(e) => eprintln!("ERROR: Failed to serialize to JSON: {}", e),
}
}
}
OutputFormat::Psv => {
println!("unix|rfc3339|human");
for r in results {
println!("{}|{}|{}", r.unix, r.rfc3339, r.human);
}
}
}
}