gitql_cli/printer/
yaml_printer.rs

1use std::io::stdout;
2use std::io::Write;
3
4use gitql_core::object::GitQLObject;
5use linked_hash_map::LinkedHashMap;
6use yaml_rust::Yaml;
7use yaml_rust::YamlEmitter;
8
9use super::BaseOutputPrinter;
10
11pub struct YAMLPrinter;
12
13impl BaseOutputPrinter for YAMLPrinter {
14    fn print(&self, object: &mut GitQLObject) {
15        let mut out_str = String::new();
16        let mut emitter = YamlEmitter::new(&mut out_str);
17
18        let columns_titles = &object.titles;
19
20        let main_group = object.groups.first().unwrap();
21        let mut rows_rows: Vec<Yaml> = Vec::with_capacity(main_group.rows.len());
22
23        for row in main_group.rows.clone() {
24            let mut vec: LinkedHashMap<Yaml, Yaml> = LinkedHashMap::new();
25            for (column_index, column_value) in row.values.iter().enumerate() {
26                vec.insert(
27                    Yaml::String(columns_titles[column_index].to_string()),
28                    Yaml::String(column_value.to_string()),
29                );
30            }
31            let row_yaml = Yaml::Hash(vec);
32            rows_rows.push(row_yaml);
33        }
34
35        if let Err(error) = emitter.dump(&Yaml::Array(rows_rows)) {
36            eprintln!("{error}");
37            std::process::exit(1);
38        }
39
40        if let Err(error) = writeln!(stdout(), "{out_str}") {
41            eprintln!("{error}");
42            std::process::exit(1);
43        }
44    }
45}