1pub use clap::Parser;
2use std::string::String;
3
4#[derive(Parser, Debug)]
9#[clap(author, version, about, long_about = None)]
10pub struct Command {
11 #[clap(short, long, value_parser=check_fraction, default_value_t = 0.1)]
14 pub left_side: f64,
15
16 #[clap(short, long, value_parser=check_fraction, default_value_t = 0.1)]
19 pub right_side: f64,
20
21 #[clap(short, long, value_parser=check_fraction, default_value_t = 0.1)]
23 pub both_end: f64,
24
25 #[clap(short, long, value_parser)]
27 pub in_bam: String,
28
29 #[clap(short, long, value_parser, default_value = "-")]
31 pub out_bam: String,
32
33 #[clap(long, action)]
35 pub inverse: bool,
36
37 #[clap(short, long, action)]
39 pub unalign: bool,
40}
41
42pub fn check_fraction(val: &str) -> Result<f64, String> {
56 let f_val: f64 = val.parse::<f64>().map_err(|e| e.to_string())?;
57 if (0.0..=1.0).contains(&f_val) {
58 Ok(f_val)
59 } else {
60 Err(format!("{} is not within 0 and 1", val))
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67 use rstest::rstest;
68
69 #[rstest]
70 #[case("1.0", 1.0)]
71 #[case("0.0", 0.0)]
72 #[case("0.5", 0.5)]
73 fn test_check_fraction(#[case] val: &str, #[case] out: f64) {
74 assert_eq!(check_fraction(val).unwrap(), out);
75 }
76
77 #[rstest]
78 #[case("1.1")]
79 #[case("-0.1")]
80 #[should_panic]
81 fn test_check_fraction_panic(#[case] val: &str) {
82 check_fraction(val).unwrap();
83 }
84}