rsv_lib/io/
flatten.rs

1use crate::{
2    args::Flatten,
3    utils::{cli_result::CliResult, reader::IoReader, table::Table},
4};
5
6impl Flatten {
7    pub fn io_run(&self) -> CliResult {
8        let n = if self.n <= 0 {
9            usize::MAX - 10
10        } else {
11            self.n as usize
12        };
13
14        // open file and header
15        let lines = IoReader::new().no_header(self.no_header).top_n(n).lines();
16
17        // too few rows
18        if lines.len() <= 1 - self.no_header as usize {
19            return Ok(());
20        }
21
22        let columns: Vec<String> = if self.no_header {
23            (1..=self.row_field_count(&lines[0]))
24                .map(|i| format!("col{i}"))
25                .collect::<Vec<_>>()
26        } else {
27            self.split_row_to_owned_vec(&lines[0])
28        };
29
30        // read file
31        lines
32            .iter()
33            .skip(1 - self.no_header as usize)
34            .enumerate()
35            .for_each(|(i, l)| {
36                println!(" {}row{}", &self.delimiter, i + 1);
37                let r = self
38                    .split(l)
39                    .zip(&columns)
40                    .map(|(v, k)| [k.as_str(), v])
41                    .collect::<Vec<_>>();
42                Table::from_records(r).print_blank().unwrap();
43            });
44
45        Ok(())
46    }
47}