1use core::fmt::Write;
8
9use crate::File;
10
11#[derive(Debug, Copy, Clone, PartialEq, Eq)]
21pub struct Position {
22 pub row: u8,
23 pub col: u8,
24}
25
26impl Position {
27 pub const fn origin() -> Position {
28 Position { row: 0, col: 0 }
29 }
30}
31
32#[derive(Debug, Copy, Clone, PartialEq, Eq)]
35#[repr(u8)]
36pub enum SgrParam {
37 Reset = 0,
38 Bold = 1,
39 Reverse = 7,
40 NotBold = 22,
41 NotReverse = 27,
42 FgBlack = 30,
43 FgRed = 31,
44 FgGreen = 32,
45 FgYellow = 33,
46 FgBlue = 34,
47 FgMagenta = 35,
48 FgCyan = 36,
49 FgWhite = 37,
50 BgBlack = 40,
51 BgRed = 41,
52 BgGreen = 42,
53 BgYellow = 43,
54 BgBlue = 44,
55 BgMagenta = 45,
56 BgCyan = 46,
57 BgWhite = 47,
58}
59
60pub fn clear_screen(f: &mut File) {
66 let _ = f.write_str("\u{001b}[2J");
67}
68
69pub fn cursor_on(f: &mut File) {
71 let _ = f.write_str("\u{001b}[?25h");
72}
73
74pub fn cursor_off(f: &mut File) {
76 let _ = f.write_str("\u{001b}[?25l");
77}
78
79pub fn move_cursor(f: &mut File, pos: Position) {
81 let _ = write!(f, "\u{001b}[{};{}H", 1 + pos.row, 1 + pos.col);
82}
83
84pub fn set_sgr<T>(f: &mut File, values: T)
88where
89 T: IntoIterator<Item = SgrParam>,
90{
91 let _ = write!(f, "\u{001b}[");
92 let mut iter = values.into_iter();
93 if let Some(value) = iter.next() {
94 let _ = write!(f, "{}", value as u8);
95 }
96 for value in iter {
97 let _ = write!(f, ";{}", value as u8);
98 }
99 let _ = write!(f, "m");
100}
101
102