use clap::{AppSettings, Parser};
use colored::Colorize;
use std::process;
use pseqsid::{Matrix, SequenceLength};
#[derive(Parser)]
#[clap(author, version, about, long_about = None)]
#[clap(global_setting(AppSettings::DeriveDisplayOrder))]
struct Cli {
msa: String,
#[clap(short, long)]
identity: bool,
#[clap(short, long)]
similarity: bool,
#[clap(short, long)]
nss: bool,
#[clap(short, long, arg_enum, default_value_t = SequenceLength::Smallest)]
length: SequenceLength,
#[clap(short, long)]
grouping: Option<String>,
#[clap(short, long, arg_enum, default_value_t = Matrix::BLOSUM62)]
matrix: Matrix,
#[clap(short, long, parse(try_from_str=p_in_range), default_value = "10.0")]
po: f64,
#[clap(short='e', long, parse(try_from_str=p_in_range), default_value = "0.5")]
pe: f64,
#[clap(short, long, default_value_t = 0)]
threads: usize,
}
fn main() {
let cli = Cli::parse();
if !cli.identity && !cli.similarity && !cli.nss {
println!("{} Nothing to do", "info:".green().bold());
println!("{} Please set -i, -s and/or -n options", "info:".green().bold());
println!("{} See --help for more information", "info:".green().bold());
process::exit(0);
}
let mut aa_grouping_filepath = "".to_string();
if cli.similarity {
aa_grouping_filepath = match cli.grouping {
Some(s) => s.to_string(),
None => match pseqsid::write_default_aa_sim_group() {
Ok(s) => s,
Err(e) => {
eprintln!("{} {}", "error:".red().bold(), e);
process::exit(0);
},
}
};
}
if let Err(e) = pseqsid::run(&cli.msa, cli.identity, cli.similarity, cli.nss, cli.length, &aa_grouping_filepath, cli.matrix, cli.po, cli.pe, cli.threads) {
eprintln!("{} {}", "error:".red().bold(), e);
}
}
fn p_in_range(ps: &str) -> Result<f64, String> {
let p: f64 = ps
.parse()
.map_err(|_| format!("`{}` isn't a real number", ps))?;
if p >= 0.0 && p <= 100.0 {
Ok(p)
} else {
Err(format!(
"gap penalty not in range 0.0 - 100.0"
))
}
}