use phcue_ck::{check_num_requests, concurrent_query_ena, parse_args, read_accessions, print_csv, print_csv_wide, print_csv_long, Run, OutputFormat};
use reqwest::Error;
use std::process::exit;
#[tokio::main]
async fn main() -> Result<(), Error> {
openssl_probe::init_ssl_cert_env_vars();
let args = parse_args();
let accessions = match args.file {
Some(file) => read_accessions(&file),
None => args.accession,
};
let num_requests = check_num_requests(args.num_requests);
let mut runs: Vec<Run> = concurrent_query_ena(accessions, num_requests).await;
if !runs.is_empty() {
runs.sort_by(|a, b| a.accession.cmp(&b.accession));
if !args.keep_single_end {
runs.iter_mut().for_each(|run| run.clean_single_end());
}
match args.format {
OutputFormat::Json => println!("{}", serde_json::to_string_pretty(&runs).unwrap()),
OutputFormat::Csv => {
let mut wtr = csv::Writer::from_writer(std::io::stdout());
return match print_csv(&mut wtr, runs) {
Ok(_) => {
eprintln!("CSV output completed successfully!");
Ok(())
},
Err(_) => {
eprintln!("Error writing csv to stdout.");
exit(1);
}
};
}
OutputFormat::CsvWide => {
let mut wtr = csv::Writer::from_writer(std::io::stdout());
return match print_csv_wide(&mut wtr, runs, args.keep_single_end) {
Ok(_) => {
eprintln!("CSV output completed successfully!");
Ok(())
},
Err(_) => {
eprintln!("Error writing csv to stdout.");
exit(1);
}
};
}
OutputFormat::CsvLong => {
let mut wtr = csv::Writer::from_writer(std::io::stdout());
return match print_csv_long(&mut wtr, runs) {
Ok(_) => {
eprintln!("CSV output completed successfully!");
Ok(())
},
Err(_) => {
eprintln!("Error writing csv to stdout.");
exit(1);
}
};
}
}
}
Ok(())
}