From cad5f5766654f6a3111d17bbf5664dd5ad916cc2 Mon Sep 17 00:00:00 2001 From: Siriwat Uamngamsup Date: Fri, 7 Mar 2025 18:10:16 +0700 Subject: [PATCH] feat: allow pass cli args with ENV --- od-msspe/Cargo.lock | 339 ----------------------------------------- od-msspe/Cargo.toml | 6 +- od-msspe/src/config.rs | 45 +++--- od-msspe/src/main.rs | 19 ++- 4 files changed, 40 insertions(+), 369 deletions(-) diff --git a/od-msspe/Cargo.lock b/od-msspe/Cargo.lock index f4fdf4e..6c24c5a 100644 --- a/od-msspe/Cargo.lock +++ b/od-msspe/Cargo.lock @@ -60,12 +60,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "anyhow" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" - [[package]] name = "approx" version = "0.5.1" @@ -92,73 +86,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" -[[package]] -name = "bio" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d563b9298d39b3bdb5c45f6e91e0bdcb18d67e6d8fa034a733b7283f2db5ed29" -dependencies = [ - "anyhow", - "approx", - "bio-types", - "bit-set", - "bv", - "bytecount", - "csv", - "custom_derive", - "editdistancek", - "enum-map", - "fxhash", - "itertools", - "itertools-num", - "lazy_static", - "multimap", - "ndarray", - "newtype_derive", - "num-integer", - "num-traits", - "ordered-float", - "petgraph", - "rand", - "regex", - "serde", - "serde_derive", - "statrs", - "strum", - "strum_macros", - "thiserror", - "triple_accel", - "vec_map", -] - -[[package]] -name = "bio-types" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4dcf54f8b7f51450207d54780bab09c05f30b8b0caa991545082842e466ad7e" -dependencies = [ - "derive-new", - "lazy_static", - "regex", - "strum_macros", - "thiserror", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "buffer-redux" version = "1.0.2" @@ -174,22 +101,6 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" -[[package]] -name = "bv" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" -dependencies = [ - "feature-probe", - "serde", -] - -[[package]] -name = "bytecount" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" - [[package]] name = "bytemuck" version = "1.20.0" @@ -318,55 +229,12 @@ dependencies = [ "memchr", ] -[[package]] -name = "custom_derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9" - -[[package]] -name = "derive-new" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "editdistancek" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e02df23d5b1c6f9e69fa603b890378123b93073df998a21e6e33b9db0a32613" - [[package]] name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" -[[package]] -name = "enum-map" -version = "2.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" -dependencies = [ - "enum-map-derive", -] - -[[package]] -name = "enum-map-derive" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "env_filter" version = "0.1.2" @@ -390,33 +258,6 @@ dependencies = [ "log", ] -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "feature-probe" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -430,12 +271,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" - [[package]] name = "heck" version = "0.5.0" @@ -463,16 +298,6 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21d32b951725c7efe88bac17f191cf2bb0028cce32d1acb3cd087755a0719b2" -[[package]] -name = "indexmap" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" -dependencies = [ - "equivalent", - "hashbrown", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -488,15 +313,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools-num" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a872a22f9e6f7521ca557660adb96dd830e54f0f490fa115bb55dd69d38b27e7" -dependencies = [ - "num-traits", -] - [[package]] name = "itoa" version = "1.0.14" @@ -525,12 +341,6 @@ version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" -[[package]] -name = "libm" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" - [[package]] name = "log" version = "0.4.22" @@ -553,15 +363,6 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "multimap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" -dependencies = [ - "serde", -] - [[package]] name = "nalgebra" version = "0.32.6" @@ -574,8 +375,6 @@ dependencies = [ "num-complex", "num-rational", "num-traits", - "rand", - "rand_distr", "simba", "typenum", ] @@ -591,30 +390,6 @@ dependencies = [ "syn", ] -[[package]] -name = "ndarray" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "portable-atomic", - "portable-atomic-util", - "rawpointer", -] - -[[package]] -name = "newtype_derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac8cd24d9f185bb7223958d8c1ff7a961b74b1953fd05dba7cc568a63b3861ec" -dependencies = [ - "rustc_version", -] - [[package]] name = "ngrams" version = "1.0.1" @@ -665,21 +440,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", - "libm", ] [[package]] name = "od-msspe" version = "0.1.0" dependencies = [ - "bio", "clap", "csv", "env_logger", "itertools", "log", "ngrams", - "regex", "seq_io", "std-dev", ] @@ -690,31 +462,12 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" -[[package]] -name = "ordered-float" -version = "4.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" -dependencies = [ - "num-traits", -] - [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - [[package]] name = "poloto" version = "18.1.1" @@ -724,21 +477,6 @@ dependencies = [ "hypermelon", ] -[[package]] -name = "portable-atomic" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" - -[[package]] -name = "portable-atomic-util" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" -dependencies = [ - "portable-atomic", -] - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -806,16 +544,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand", -] - [[package]] name = "rand_xorshift" version = "0.3.0" @@ -860,21 +588,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "rustc_version" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" -dependencies = [ - "semver", -] - -[[package]] -name = "rustversion" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" - [[package]] name = "ryu" version = "1.0.18" @@ -896,12 +609,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" -[[package]] -name = "semver" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" - [[package]] name = "seq_io" version = "0.3.2" @@ -949,18 +656,6 @@ dependencies = [ "wide", ] -[[package]] -name = "statrs" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f697a07e4606a0a25c044de247e583a330dbb1731d11bc7350b81f48ad567255" -dependencies = [ - "approx", - "nalgebra", - "num-traits", - "rand", -] - [[package]] name = "std-dev" version = "0.1.0" @@ -986,25 +681,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn", -] - [[package]] name = "syn" version = "2.0.90" @@ -1050,12 +726,6 @@ dependencies = [ "syn", ] -[[package]] -name = "triple_accel" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22048bc95dfb2ffd05b1ff9a756290a009224b60b2f0e7525faeee7603851e63" - [[package]] name = "typenum" version = "1.17.0" @@ -1074,15 +744,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" -dependencies = [ - "serde", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/od-msspe/Cargo.toml b/od-msspe/Cargo.toml index 4ad248b..47f2a46 100644 --- a/od-msspe/Cargo.toml +++ b/od-msspe/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "od-msspe" version = "0.1.0" -edition = "2021" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -10,9 +10,7 @@ ngrams = "1.0.1" log = "0.4.22" seq_io = "0.3.2" env_logger = "0.11.5" -bio = "2.0.3" std-dev = "0.1.0" itertools = "0.13.0" csv = "1.3.1" -regex = "1.11.1" -clap = { version = "4.5.23", features = ["derive"] } +clap = { version = "4.5.23", features = ["derive", "env"] } diff --git a/od-msspe/src/config.rs b/od-msspe/src/config.rs index a05b676..f012b97 100644 --- a/od-msspe/src/config.rs +++ b/od-msspe/src/config.rs @@ -17,47 +17,48 @@ pub struct Args { #[arg(short, long)] pub output: String, - #[arg(long, default_value_t = KMER_SIZE)] + #[arg(long, env = "KMER_SIZE", default_value_t = KMER_SIZE)] pub kmer_size: usize, - #[arg(long, default_value_t = WINDOW_SIZE)] + #[arg(long, env = "WINDOW_SIZE", default_value_t = WINDOW_SIZE)] pub window_size: usize, - #[arg(long, default_value_t = OVERLAP_SIZE)] + #[arg(long, env = "OVERLAP_SIZE", default_value_t = OVERLAP_SIZE)] pub overlap_size: usize, - #[arg(long, default_value_t = MAX_MISMATCH_SEGMENTS)] + #[arg(long, env = "MAX_MISMATCH_SEGMENTS", default_value_t = MAX_MISMATCH_SEGMENTS)] pub max_mismatch_segments: usize, - #[arg(long, default_value_t = MAX_ITERATIONS)] + #[arg(long, env = "MAX_ITERATIONS", default_value_t = MAX_ITERATIONS)] pub max_iterations: usize, - #[arg(long, default_value_t = SEARCH_WINDOWS_SIZE)] + #[arg(long, env = "SEARCH_WINDOWS_SIZE", default_value_t = SEARCH_WINDOWS_SIZE)] pub search_windows_size: usize, - #[arg(long, default_value_t = MV_CONC)] + #[arg(long, env = "MV_CONC", default_value_t = MV_CONC)] pub mv_conc: f32, - #[arg(long, default_value_t = DV_CONC)] + #[arg(long, env = "DV_CONC", default_value_t = DV_CONC)] pub dv_conc: f32, - #[arg(long, default_value_t = DNTP_CONC)] + #[arg(long, env = "DNTP_CONC", default_value_t = DNTP_CONC)] pub dntp_conc: f32, - #[arg(long, default_value_t = DNA_CONC)] + #[arg(long, env = "DNA_CONC", default_value_t = DNA_CONC)] pub dna_conc: f32, - #[arg(long, default_value_t = ANNEALING_TEMP)] + #[arg(long, env = "ANNEALING_TEMP", default_value_t = ANNEALING_TEMP)] pub annealing_temp: f32, - #[arg(long, default_value_t = PRIMER_MIN_TM)] + #[arg(long, env = "MIN_TM", default_value_t = PRIMER_MIN_TM)] pub min_tm: f32, - #[arg(long, default_value_t = PRIMER_MAX_TM)] + #[arg(long, env = "MAX_TM", default_value_t = PRIMER_MAX_TM)] pub max_tm: f32, - #[arg(long, default_value_t = PRIMER_MAX_SELF_ANY_TH)] + #[arg(long, env = "MAX_SELF_DIMER_ANY_TM", default_value_t = PRIMER_MAX_SELF_ANY_TH)] pub max_self_dimer_any_tm: f32, - #[arg(long, default_value_t = PRIMER_MAX_SELF_END_TH)] + #[arg(long, env = "MAX_SELF_DIMER_END_TM", default_value_t = PRIMER_MAX_SELF_END_TH)] pub max_self_dimer_end_tm: f32, - #[arg(long, default_value_t = PRIMER_MAX_HAIRPIN_TH)] + #[arg(long, env = "MAX_HAIRPIN_TM", default_value_t = PRIMER_MAX_HAIRPIN_TH)] pub max_hairpin_tm: f32, - #[arg(long, default_value_t = DELTA_G_THRESHOLD, help = "Threshold for dG, default is -9000.0 J/mol")] + #[arg(long, env = "DELTA_G_THRESHOLD", default_value_t = DELTA_G_THRESHOLD, help = "Threshold for dG, default is -9000.0 J/mol")] pub delta_g_threshold: f32, // logic based config #[arg( group = "flag", long, + env = "KEEP_ALL", default_value = "no", value_parser = ["yes", "no"], help = "Ignores all filtering and does NOT remove any primers." @@ -67,6 +68,7 @@ pub struct Args { #[arg( group = "flag", long, + env = "CHECK_CROSS_DIMERS", default_value = "yes", value_parser = ["yes", "no"], help = "\ @@ -78,6 +80,7 @@ pub struct Args { #[arg( group = "flag", long, + env = "CHECK_SELF_DIMERS", default_value = "yes", value_parser = ["yes", "no"], help = "Calculates Tm for a self-dimer of an individual primer sequence." @@ -87,6 +90,7 @@ pub struct Args { #[arg( group = "flag", long, + env = "CHECK_HAIRPIN", default_value = "yes", value_parser = ["yes", "no"], help = "Calculates Tm for a hairpin of an individual primer sequence." @@ -96,6 +100,7 @@ pub struct Args { #[arg( group = "flag", long, + env = "STRICT_TM_RANGE", default_value = "yes", value_parser = ["yes", "no"], help = "Removes primers with melting temperature greater than 2 standard deviations from mean of the Tm values for all primers in set. Default is true." @@ -104,17 +109,17 @@ pub struct Args { #[arg( group = "flag", long, + env = "DO_ALIGN", default_value = "yes", - value_parser = ["yes", "no"], help = "Does MAFFT multiple sequence alignment." )] pub do_align: String, // vendor binary path - #[arg(long, default_value_t = DEFAULT_NTTHAL_PATH.to_string())] + #[arg(long, env ="NTTHAL", default_value_t = DEFAULT_NTTHAL_PATH.to_string())] pub ntthal: String, - #[arg(long, default_value_t = DEFAULT_PRIMER3_PATH.to_string())] + #[arg(long, env = "PRIMER3", default_value_t = DEFAULT_PRIMER3_PATH.to_string())] pub primer3: String, } diff --git a/od-msspe/src/main.rs b/od-msspe/src/main.rs index 78751b7..e17aa9e 100644 --- a/od-msspe/src/main.rs +++ b/od-msspe/src/main.rs @@ -4,10 +4,10 @@ mod delta_g; mod graphdb; mod primer; -use crate::config::{find_executable, PrimerConfig, ProgramConfig}; +use crate::config::{PrimerConfig, ProgramConfig, find_executable}; use crate::constants::{SEQ_DIR_FWD, SEQ_DIR_REV}; -use crate::delta_g::{run_ntthal, NtthalOptions}; -use crate::primer::{check_primers, CheckPrimerParams, PrimerInfo}; +use crate::delta_g::{NtthalOptions, run_ntthal}; +use crate::primer::{CheckPrimerParams, PrimerInfo, check_primers}; use clap::Parser; use config::Args; use graphdb::Edge; @@ -282,7 +282,7 @@ fn find_most_freq_kmer<'a>( kmer_freq_map .iter() - .max_by_key(|(_, &v)| v) + .max_by_key(|&(_, &v)| v) .map(|(k, &f)| KmerFrequency { kmer: k, frequency: f, @@ -474,6 +474,7 @@ fn main() -> io::Result<()> { env_logger::init(); let args = Args::parse(); + log::debug!("args: do_align={:?}", args.do_align); let filename = args.input.to_string(); let output_file = args.output.to_string(); @@ -492,10 +493,16 @@ fn main() -> io::Result<()> { let primer3_path = find_executable(args.primer3.as_str(), !is_primer3_path_default); // check if both ntthal and primer3 are available if ntthal_path.is_none() { - panic!("Binary ntthal({}) not found in the system. Make sure program is installed and specify the path with --ntthal", args.ntthal); + panic!( + "Binary ntthal({}) not found in the system. Make sure program is installed and specify the path with --ntthal", + args.ntthal + ); } if primer3_path.is_none() { - panic!("Binary primer3({}) not found in the system. Make sure program is installed and specify the path with --primer3", args.ntthal); + panic!( + "Binary primer3({}) not found in the system. Make sure program is installed and specify the path with --primer3", + args.ntthal + ); } let program_config = ProgramConfig {