rsv_lib/utils/
util.rs

1use std::io::{stdout, BufWriter, Error, Write};
2
3pub fn datetime_str() -> String {
4    let t = chrono::offset::Local::now();
5    t.format("%Y%m%d%H%M%S").to_string()
6    // "".to_owned()
7}
8
9pub fn is_null(s: &str) -> bool {
10    s.is_empty() || s == "NA" || s == "Na" || s == "na" || s == "NULL" || s == "Null" || s == "null"
11}
12
13pub fn get_valid_sep(sep: &str) -> Result<char, Error> {
14    let cleaned_sep = sep.replace("\"", "").replace("'", "");
15
16    if cleaned_sep == "\\t" || cleaned_sep == "t" {
17        Ok('\t')
18    } else if cleaned_sep == "," {
19        Ok(',')
20    } else if cleaned_sep.len() == 1 {
21        Ok(cleaned_sep.chars().next().unwrap())
22    } else {
23        werr_exit!("cannot parse separator <{}>.", sep);
24    }
25}
26
27/// early return when pipeline closed
28pub fn print_frequency_table(names: &[String], freq: Vec<(String, usize)>) {
29    let mut wtr = BufWriter::new(stdout());
30
31    if writeln!(wtr, "{}", names.join(",")).is_err() {
32        return;
33    };
34
35    for (k, n) in &freq {
36        if writeln!(wtr, "{k},{n}").is_err() {
37            return;
38        }
39    }
40}
41
42macro_rules! werr_exit {
43    ($($arg:tt)*) => ({
44        use std::io::Write;
45        use std::process;
46        (writeln!(&mut ::std::io::stderr(), $($arg)*)).unwrap();
47        process::exit(1);
48    });
49}
50
51pub(crate) use werr_exit;