homestar_runtime/cli/
show.rs

1//! Styled, output response for console table.
2
3use std::{
4    fmt,
5    io::{self, Write},
6};
7use tabled::{
8    settings::{
9        object::Rows,
10        style::{BorderColor, BorderSpanCorrection},
11        Alignment, Color, Modify, Panel, Style,
12    },
13    Table,
14};
15
16/// Panel title for the output table.
17pub(crate) const TABLE_TITLE: &str = "homestar(╯°□°)╯";
18
19/// Output response wrapper.
20#[derive(Debug, Clone, PartialEq)]
21pub struct Output(String);
22
23impl fmt::Display for Output {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        write!(f, "{}", self.0.trim_end())
26    }
27}
28
29impl Output {
30    /// Create a new output response.
31    pub(crate) fn new(table: String) -> Self {
32        Self(table)
33    }
34
35    /// Get the inner string as a reference.
36    #[allow(dead_code)]
37    pub(crate) fn inner(&self) -> &str {
38        &self.0
39    }
40
41    /// Print ouput response to console via [io::stdout].
42    pub(crate) fn echo(&self) -> Result<(), io::Error> {
43        let stdout = io::stdout();
44        let mut handle = io::BufWriter::new(stdout);
45        writeln!(handle, "{}", self.0)
46    }
47}
48
49/// Trait for console table output responses.
50pub trait ConsoleTable {
51    /// Get the table as an output response.
52    fn table(&self) -> Output;
53    /// Print the table to console.
54    fn echo_table(&self) -> Result<(), io::Error>;
55}
56
57/// Style trait for console table output responses.
58#[allow(dead_code)]
59pub(crate) trait ApplyStyle {
60    fn default(&mut self) -> Output;
61    fn default_with_title(&mut self, ext_title: &str) -> Output;
62}
63
64impl ApplyStyle for Table {
65    fn default(&mut self) -> Output {
66        let table = self
67            .with(Style::modern())
68            .with(Panel::header(TABLE_TITLE))
69            .with(Modify::new(Rows::first()).with(Alignment::left()))
70            .with(BorderColor::filled(Color::FG_WHITE))
71            .with(BorderSpanCorrection)
72            .to_string();
73
74        Output(table)
75    }
76
77    fn default_with_title(&mut self, ext_title: &str) -> Output {
78        let table = self
79            .with(Style::modern())
80            .with(Panel::header(format!("{TABLE_TITLE} - {ext_title}")))
81            .with(Modify::new(Rows::first()).with(Alignment::left()))
82            .with(BorderColor::filled(Color::FG_WHITE))
83            .with(BorderSpanCorrection)
84            .to_string();
85
86        Output(table)
87    }
88}