solv/
ux.rs

1use comfy_table::{presets, Attribute, Cell, ContentArrangement, Row, Table, TableComponent};
2use crossterm::style::{style, Color, Stylize};
3
4#[must_use]
5pub fn new_table() -> Table {
6    let mut table = Table::new();
7    table
8        .load_preset(presets::UTF8_FULL_CONDENSED)
9        .set_style(TableComponent::BottomBorder, ' ')
10        .set_style(TableComponent::BottomBorderIntersections, ' ')
11        .set_style(TableComponent::TopBorder, ' ')
12        .set_style(TableComponent::TopBorderIntersections, ' ')
13        .set_style(TableComponent::HeaderLines, '-')
14        .set_style(TableComponent::RightHeaderIntersection, ' ')
15        .set_style(TableComponent::LeftHeaderIntersection, ' ')
16        .set_style(TableComponent::MiddleHeaderIntersections, ' ')
17        .set_style(TableComponent::LeftBorder, ' ')
18        .set_style(TableComponent::RightBorder, ' ')
19        .set_style(TableComponent::TopRightCorner, ' ')
20        .set_style(TableComponent::TopLeftCorner, ' ')
21        .set_style(TableComponent::BottomLeftCorner, ' ')
22        .set_style(TableComponent::BottomRightCorner, ' ')
23        .set_style(TableComponent::VerticalLines, ' ')
24        .set_content_arrangement(ContentArrangement::Dynamic);
25    table
26}
27
28pub fn print_one_column_table<I: ExactSizeIterator<Item = S>, S: ToString>(
29    head: &str,
30    head_color: Option<comfy_table::Color>,
31    rows: I,
32) {
33    if let Some(t) = create_one_column_table(head, head_color, rows) {
34        println!("{t}");
35    }
36}
37
38pub fn create_one_column_table<I: ExactSizeIterator<Item = S>, S: ToString>(
39    head: &str,
40    head_color: Option<comfy_table::Color>,
41    rows: I,
42) -> Option<Table> {
43    if rows.len() == 0 {
44        None
45    } else {
46        let mut table = new_table();
47        let mut head = Cell::new(head).add_attribute(Attribute::Bold);
48        if let Some(fg) = head_color {
49            head = head.fg(fg);
50        }
51        table.set_header([head]);
52        table.add_rows(rows.into_iter().map(|s| Row::from([s])));
53
54        Some(table)
55    }
56}
57
58#[must_use]
59pub fn create_solution_table(path: &str) -> Table {
60    let mut table = new_table();
61    table.set_header([Cell::new(path).add_attribute(Attribute::Bold).fg(
62        comfy_table::Color::Rgb {
63            r: 0xAA,
64            g: 0xAA,
65            b: 0xAA,
66        },
67    )]);
68    table.set_style(TableComponent::HeaderLines, ' ');
69    table
70}
71
72pub fn print_solution_path(path: &str) {
73    let path = style(path)
74        .with(Color::Rgb {
75            r: 0xAA,
76            g: 0xAA,
77            b: 0xAA,
78        })
79        .bold();
80    println!(" {path}");
81}