rsv_lib/utils/
table.rs

1use super::{cli_result::CliResult, constants::TERMINATOR};
2use std::{
3    io::{stdout, BufWriter, Write},
4    process,
5};
6use tabled::{builder::Builder, settings::Style};
7
8pub struct Table {
9    builder: Builder,
10    n: usize,
11}
12
13impl Table {
14    pub fn new() -> Self {
15        Table {
16            builder: Builder::default(),
17            n: 0,
18        }
19    }
20
21    fn is_empty(&self) -> bool {
22        self.n == 0
23    }
24
25    pub fn add_record<R, T>(&mut self, row: R)
26    where
27        R: IntoIterator<Item = T>,
28        T: Into<String>,
29    {
30        self.builder.push_record(row);
31        self.n += 1;
32    }
33
34    // pub fn from_rows(rows: &'a Vec<String>, sep: &str) -> Self {
35    //     let r = rows
36    //         .iter()
37    //         .map(|i| i.split(sep).collect::<Vec<_>>())
38    //         .collect::<Vec<_>>();
39
40    //     let mut b = Builder::default();
41    //     let n = rows.len();
42    //     for row in r {
43    //         b.add_record(row);
44    //     }
45
46    //     Table { builder: b, n }
47    // }
48
49    pub fn from_records<R, T>(rows: Vec<R>) -> Self
50    where
51        R: IntoIterator<Item = T>,
52        T: Into<String>,
53    {
54        let mut b = Builder::default();
55        let n = rows.len();
56
57        for row in rows {
58            b.push_record(row);
59        }
60
61        Table { builder: b, n }
62    }
63
64    pub fn print_blank(self) -> CliResult {
65        if self.is_empty() {
66            return Ok(());
67        }
68
69        // build
70        let mut table = self.builder.build();
71        table.with(Style::empty());
72
73        // print
74        let mut wtr = BufWriter::new(stdout());
75        wtr.write_all(table.to_string().as_bytes())?;
76        wtr.write_all(TERMINATOR)?;
77
78        Ok(())
79    }
80
81    pub fn print_blank_unchecked(self) {
82        if self.print_blank().is_err() {
83            process::exit(0)
84        }
85    }
86}