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 let out = new_path(path, "-selected").with_extension("csv");
17
18 let mut wtr = Writer::file_or_stdout(self.export, &out)?;
20 let mut rdr = ExcelReader::new(path, self.sheet)?;
21
22 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 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 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}