1pub const CORNER_TOP_LEFT: &str = "\u{256d}";
4pub const CORNER_TOP_RIGHT: &str = "\u{256e}";
5pub const CORNER_BOTTOM_LEFT: &str = "\u{2570}";
6pub const CORNER_BOTTOM_RIGHT: &str = "\u{256f}";
7pub const VERTICAL: &str = "\u{2502}";
8pub const HORIZONTAL: &str = "\u{2500}";
9
10pub const CHROME_WIDTH: u16 = 4;
12pub const CONTENT_OFFSET: u16 = 2;
14pub const INNER_PADDING: usize = 2;
16pub const BORDER_ROWS: u16 = 2;
18
19pub fn snap_even(raw: u16, min_width: u16) -> u16 {
23 let even = (raw / 2) * 2;
24 if even == 0 && raw > 0 {
25 min_width
26 } else {
27 even
28 }
29}
30
31pub fn top_border(inner_width: u16) -> String {
33 let fill: String = HORIZONTAL.repeat(inner_width as usize + INNER_PADDING);
34 format!("{CORNER_TOP_LEFT}{fill}{CORNER_TOP_RIGHT}")
35}
36
37pub fn bottom_border(inner_width: u16) -> String {
39 let fill: String = HORIZONTAL.repeat(inner_width as usize + INNER_PADDING);
40 format!("{CORNER_BOTTOM_LEFT}{fill}{CORNER_BOTTOM_RIGHT}")
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46
47 #[test]
48 fn top_border_has_correct_corners() {
49 let border = top_border(10);
50 assert!(border.starts_with(CORNER_TOP_LEFT));
51 assert!(border.ends_with(CORNER_TOP_RIGHT));
52 }
53
54 #[test]
55 fn bottom_border_has_correct_corners() {
56 let border = bottom_border(10);
57 assert!(border.starts_with(CORNER_BOTTOM_LEFT));
58 assert!(border.ends_with(CORNER_BOTTOM_RIGHT));
59 }
60
61 #[test]
62 fn border_fill_width_includes_inner_padding() {
63 let border = top_border(5);
64 let fill_chars = border.chars().count() - 2; assert_eq!(fill_chars, 5 + INNER_PADDING);
66 }
67
68 #[test]
69 fn snap_even_rounds_down_to_even() {
70 assert_eq!(snap_even(5, 2), 4);
71 assert_eq!(snap_even(7, 2), 6);
72 assert_eq!(snap_even(4, 2), 4);
73 }
74
75 #[test]
76 fn snap_even_uses_min_when_rounding_collapses_to_zero() {
77 assert_eq!(snap_even(1, 2), 2);
78 assert_eq!(snap_even(0, 2), 0);
79 }
80}