coded_chars/
escape.rs

1//! This module provides escape sequences not sorted elsewhere...
2//!
3//! The [EscapeSequence] struct is [Display]able.
4
5use 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
27/// Padding character
28pub const PAD: EscapeSequence = escape('@');
29
30/// High octet preset
31pub const HOP: EscapeSequence = escape('A');
32
33/// Index
34pub const IND: EscapeSequence = escape('D');
35
36/// Private use 1
37pub const PU1: EscapeSequence = escape('Q');
38
39/// Private use 2
40pub const PU2: EscapeSequence = escape('R');
41
42/// Set transmit state
43pub const STS: EscapeSequence = escape('S');
44
45/// Cancel character
46pub const CCH: EscapeSequence = escape('T');
47
48/// Message waiting
49pub const MW: EscapeSequence = escape('U');
50
51/// Single graphic character introducer
52pub 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}