rsv_lib/io/
select.rs

1use crate::args::Select;
2use crate::utils::column::Columns;
3use crate::utils::filename::new_file;
4use crate::utils::filter::Filter;
5use crate::utils::{cli_result::CliResult, writer::Writer};
6use std::io::{stdin, BufRead};
7
8impl Select {
9    pub fn io_run(&self) -> CliResult {
10        // current file
11        let out = new_file("selected.csv");
12
13        // filters and cols
14        let mut filter = Filter::new(&self.filter);
15        let mut col = Columns::new(&self.cols);
16
17        // open file
18        let mut wtr = Writer::file_or_stdout(self.export, &out)?;
19        let mut rdr = stdin().lock().lines();
20
21        // header
22        if !self.no_header {
23            let Some(r) = rdr.next() else { return Ok(()) };
24            let r = r?;
25
26            let fields = self.split_row_to_vec(&r);
27            col = col.total_col(fields.len()).parse();
28            filter = filter.total_col(fields.len()).parse();
29
30            if col.select_all {
31                wtr.write_str_unchecked(&r)
32            } else {
33                let r = col.iter().map(|&i| fields[i]).collect::<Vec<_>>();
34                wtr.write_fields_unchecked(&r);
35            }
36        }
37
38        for r in rdr {
39            let r = r?;
40
41            if !col.parsed {
42                let n = self.row_field_count(&r);
43                col = col.total_col(n).parse();
44            }
45            if !filter.parsed {
46                let n = self.row_field_count(&r);
47                filter = filter.total_col(n).parse();
48            }
49
50            if filter.is_empty() && col.select_all {
51                wtr.write_str_unchecked(r);
52                continue;
53            }
54
55            let mut f = self.split_row_to_vec(&r);
56            if !filter.is_empty() && !filter.record_is_valid(&f) {
57                continue;
58            }
59
60            if !col.select_all {
61                f = col.iter().map(|&i| f[i]).collect();
62            }
63
64            wtr.write_fields_unchecked(&f);
65        }
66
67        if self.export {
68            println!("Saved to file: {}", out.display())
69        }
70
71        Ok(())
72    }
73}