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_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 let mut table = self.builder.build();
71 table.with(Style::empty());
72
73 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}