rsv_lib/excel/
select.rs

1use crate::args::Select;
2use crate::utils::cli_result::CliResult;
3use crate::utils::column::Columns;
4use crate::utils::constants::COMMA;
5use crate::utils::excel::datatype_vec_to_string_vec;
6use crate::utils::filename::new_path;
7use crate::utils::filter::Filter;
8use crate::utils::reader::ExcelReader;
9use crate::utils::writer::Writer;
10
11impl Select {
12    pub fn excel_run(&self) -> CliResult {
13        let path = &self.path();
14
15        // out path
16        let out = new_path(path, "-selected").with_extension("csv");
17
18        // open file
19        let mut wtr = Writer::file_or_stdout(self.export, &out)?;
20        let mut rdr = ExcelReader::new(path, self.sheet)?;
21
22        // cols and filters
23        let n = rdr.column_n();
24        let cols = Columns::new(&self.cols).total_col(n).parse();
25        let filter = Filter::new(&self.filter).total_col(n).parse();
26
27        // header
28        if !self.no_header {
29            let Some(r) = rdr.next() else { return Ok(()) };
30            if cols.select_all {
31                wtr.write_excel_line_unchecked(r, COMMA);
32            } else {
33                let r = cols.iter().map(|&i| r[i].to_string()).collect::<Vec<_>>();
34                wtr.write_fields_unchecked(&r);
35            }
36        }
37
38        // read
39        rdr.iter().skip(rdr.next_called).for_each(|r| {
40            let r = datatype_vec_to_string_vec(r);
41            if filter.excel_record_is_valid(&r) {
42                match cols.select_all {
43                    true => wtr.write_fields_unchecked(&r),
44                    false => {
45                        let r = cols.iter().map(|&i| &r[i]).collect::<Vec<_>>();
46                        wtr.write_fields_unchecked(&r);
47                    }
48                }
49            }
50        });
51
52        if self.export {
53            println!("\nSaved to file: {}", out.display())
54        }
55
56        Ok(())
57    }
58}