1use crate::introducers::ESC;
6use std::fmt::{Display, Formatter};
7
8#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)]
9pub struct EscapeSequence(char);
10
11impl EscapeSequence {
12 pub const fn new(with: char) -> Self {
13 Self(with)
14 }
15}
16
17impl Display for EscapeSequence {
18 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
19 write!(f, "{}{}", ESC, self.0)
20 }
21}
22
23pub const fn escape(c: char) -> EscapeSequence {
24 EscapeSequence::new(c)
25}
26
27pub const PAD: EscapeSequence = escape('@');
29
30pub const HOP: EscapeSequence = escape('A');
32
33pub const IND: EscapeSequence = escape('D');
35
36pub const PU1: EscapeSequence = escape('Q');
38
39pub const PU2: EscapeSequence = escape('R');
41
42pub const STS: EscapeSequence = escape('S');
44
45pub const CCH: EscapeSequence = escape('T');
47
48pub const MW: EscapeSequence = escape('U');
50
51pub const SGC: EscapeSequence = escape('Y');
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn test_escape_sequence_new() {
60 let seq = EscapeSequence::new('A');
61 assert_eq!(seq.0, 'A');
62 }
63
64 #[test]
65 fn test_escape_sequence_display() {
66 let seq = EscapeSequence::new('A');
67 let formatted = format!("{}", seq);
68 assert_eq!(formatted, format!("{}A", ESC));
69 }
70
71 #[test]
72 fn test_escape_function() {
73 let seq = escape('B');
74 assert_eq!(seq.0, 'B');
75 }
76
77 #[test]
78 fn test_constants_display() {
79 assert_eq!(format!("{}", PAD), format!("{}@", ESC));
80 assert_eq!(format!("{}", HOP), format!("{}A", ESC));
81 assert_eq!(format!("{}", IND), format!("{}D", ESC));
82 assert_eq!(format!("{}", PU1), format!("{}Q", ESC));
83 assert_eq!(format!("{}", PU2), format!("{}R", ESC));
84 assert_eq!(format!("{}", STS), format!("{}S", ESC));
85 assert_eq!(format!("{}", CCH), format!("{}T", ESC));
86 assert_eq!(format!("{}", MW), format!("{}U", ESC));
87 assert_eq!(format!("{}", SGC), format!("{}Y", ESC));
88 }
89}