gitql_cli/printer/
yaml_printer.rs1use 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}