1use crate::{left_pad, max_length};
2
3#[derive(Debug, Clone)]
4pub struct Row {
5 headers: Vec<String>,
6 values: Vec<String>,
7}
8
9impl Row {
10 pub(crate) fn new(headers: Vec<String>, values: Vec<String>) -> Row {
11 Row { headers, values }
12 }
13
14 pub(crate) fn get_values(&self) -> &Vec<String> {
15 &self.values
16 }
17
18 pub(crate) fn rename(&self, new_headers: &[String]) -> Row {
19 Row {
20 headers: new_headers.to_owned(),
21 values: self.values.clone(),
22 }
23 }
24}
25
26impl std::ops::Index<usize> for Row {
27 type Output = String;
28
29 fn index(&self, index: usize) -> &Self::Output {
30 &self.values[index]
31 }
32}
33
34impl std::fmt::Display for Row {
35 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
36 let header_width = max_length!(self.headers);
37 let value_width = max_length!(self.values);
38 let w = 4;
39
40 for (i, header) in self.headers.iter().enumerate() {
41 write!(f, "{}", left_pad!(header, header_width))?;
42 write!(f, "{}", " ".repeat(w))?;
43 write!(f, "{}", left_pad!(&self.values[i], value_width))?;
44 if i < self.headers.len() - 1 {
45 writeln!(f)?;
46 }
47 }
48
49 Ok(())
50 }
51}