1use crate::args::Sort;
2use crate::utils::cli_result::CliResult;
3use crate::utils::filename::new_path;
4use crate::utils::sort::SortColumns;
5use crate::utils::writer::Writer;
6use std::fs::File;
7use std::io::{BufRead, BufReader};
8
9impl Sort {
10 pub fn csv_run(&self) -> CliResult {
11 let path = &self.path();
12
13 let mut rdr = BufReader::new(File::open(path)?).lines();
15 let out = new_path(path, "-sorted");
16 let mut wtr = Writer::file_or_stdout(self.export, &out)?;
17
18 let cols = SortColumns::from(&self.cols)?;
20
21 if !self.no_header {
23 let Some(r) = rdr.next() else { return Ok(()) };
24 wtr.write_str_unchecked(r?);
25 }
26
27 let lines = rdr.filter_map(|i| i.ok()).collect::<Vec<_>>();
29
30 cols.sort_and_write(&lines, self.sep, self.quote, &mut wtr)?;
32
33 if self.export {
34 println!("Saved to file: {}", out.display())
35 }
36
37 Ok(())
38 }
39}