gitql_cli/printer/
csv_printer.rs

1use std::io::stdout;
2use std::io::Write;
3
4use csv::Writer;
5use gitql_core::object::GitQLObject;
6
7use super::BaseOutputPrinter;
8
9pub struct CSVPrinter;
10
11impl BaseOutputPrinter for CSVPrinter {
12    fn print(&self, object: &mut GitQLObject) {
13        let mut writer = Writer::from_writer(vec![]);
14        let _ = writer.write_record(object.titles.clone());
15        let row_len = object.titles.len();
16        if let Some(group) = object.groups.first() {
17            for row in &group.rows {
18                let mut values_row: Vec<String> = Vec::with_capacity(row_len);
19                for value in &row.values {
20                    values_row.push(value.literal());
21                }
22                let _ = writer.write_record(values_row);
23            }
24        }
25
26        if let Ok(writer_content) = writer.into_inner() {
27            if let Ok(content) = String::from_utf8(writer_content) {
28                if let Err(error) = writeln!(stdout(), "{content}") {
29                    eprintln!("{error}");
30                    std::process::exit(1);
31                }
32            }
33        }
34    }
35}