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 let out = new_file("selected.csv");
12
13 let mut filter = Filter::new(&self.filter);
15 let mut col = Columns::new(&self.cols);
16
17 let mut wtr = Writer::file_or_stdout(self.export, &out)?;
19 let mut rdr = stdin().lock().lines();
20
21 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}