1use crate::args::Slice;
2use crate::utils::cli_result::CliResult;
3use crate::utils::constants::COMMA;
4use crate::utils::filename::new_path;
5use crate::utils::reader::ExcelReader;
6use crate::utils::util::werr_exit;
7use crate::utils::writer::Writer;
8
9impl Slice {
10 pub fn excel_run(&self) -> CliResult {
11 let path = &self.path();
12 let out = new_path(path, "-slice").with_extension("csv");
14
15 let mut wtr = Writer::file_or_stdout(self.export, &out)?;
17 let mut rdr = ExcelReader::new(path, self.sheet)?;
18
19 if !self.no_header {
21 let Some(r) = rdr.next() else { return Ok(()) };
22 wtr.write_excel_line_unchecked(r, COMMA)
23 }
24
25 match self.index {
27 Some(index) => write_by_index(&mut rdr, &mut wtr, index),
28 None => {
29 let end = self
30 .end
31 .or_else(|| self.length.map(|l| self.start + l))
32 .unwrap_or(usize::MAX - 10);
33 if self.start > end {
34 werr_exit!("Error: end index should be equal to or bigger than start index.");
35 }
36 write_by_range(&mut rdr, &mut wtr, self.start, end);
37 }
38 }
39
40 if self.export {
41 println!("Saved to file: {}", out.display())
42 }
43
44 Ok(())
45 }
46}
47
48fn write_by_index(rdr: &mut ExcelReader, wtr: &mut Writer, index: usize) {
49 for r in rdr.iter().skip(rdr.next_called + index).take(1) {
50 wtr.write_excel_line_unchecked(r, COMMA);
51 }
52}
53
54fn write_by_range(rdr: &mut ExcelReader, wtr: &mut Writer, start: usize, end: usize) {
55 for r in rdr.iter().skip(rdr.next_called + start).take(end - start) {
56 wtr.write_excel_line_unchecked(r, COMMA);
57 }
58}