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 }
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
27pub 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;