use std::fmt::{Display, Formatter};
use crate::control::ControlSequence;
use crate::escape::{escape, EscapeSequence};
pub const DC1: char = '\x11';
pub const DC2: char = '\x12';
pub const DC3: char = '\x13';
pub const DC4: char = '\x14';
pub const DMI: EscapeSequence = escape('`');
pub const EMI: EscapeSequence = escape('b');
pub const INT: EscapeSequence = escape('a');
pub const RIS: EscapeSequence = escape('c');
pub fn attributes(n: usize) -> ControlSequence {
ControlSequence::new(&[&n.to_string()], "c")
}
#[derive(Copy, Clone, Debug)]
pub enum StatusReport {
Ready,
BusyRetry,
BusyWaiting,
ErrorRetry,
ErrorWaiting,
MessageWaiting,
PositionWaiting,
}
impl Display for StatusReport {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", match self {
StatusReport::Ready => "0",
StatusReport::BusyRetry => "1",
StatusReport::BusyWaiting => "2",
StatusReport::ErrorRetry => "3",
StatusReport::ErrorWaiting => "4",
StatusReport::MessageWaiting => "5",
StatusReport::PositionWaiting => "6",
})
}
}
pub fn report_status(status_report: StatusReport) -> ControlSequence {
ControlSequence::new(&[&status_report.to_string()], "c")
}
pub fn function_key(n: usize) -> ControlSequence {
ControlSequence::new(&[&n.to_string()], " W")
}
pub fn identify_control_string(control_string: ControlString) -> ControlSequence {
ControlSequence::new(&[&control_string.to_string()], " O")
}
#[derive(Copy, Clone, Debug)]
pub enum ControlString {
SRTMDiagnose,
Ecma35DCRS,
}
impl Display for ControlString {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", match self {
ControlString::SRTMDiagnose => "1",
ControlString::Ecma35DCRS => "2"
})
}
}
pub fn identify_graphic_sub(n: usize) -> ControlSequence {
ControlSequence::new(&[&n.to_string()], " W")
}
#[derive(Copy, Clone, Debug)]
pub enum CopyStatus {
InitTo1,
InitFrom1,
InitTo2,
InitFrom2,
Stop1,
Start1,
Stop2,
Start2,
}
impl Display for CopyStatus {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", match self {
CopyStatus::InitTo1 => "0",
CopyStatus::InitFrom1 => "1",
CopyStatus::InitTo2 => "2",
CopyStatus::InitFrom2 => "3",
CopyStatus::Stop1 => "4",
CopyStatus::Start1 => "5",
CopyStatus::Stop2 => "6",
CopyStatus::Start2 => "7",
})
}
}
pub fn media_copy(copy_status: CopyStatus) -> ControlSequence {
ControlSequence::new(&[©_status.to_string()], "i")
}
pub fn eject_and_feed(bin: usize, stacker: usize) -> ControlSequence {
ControlSequence::new(&[&bin.to_string(), &stacker.to_string()], " Y")
}
#[cfg(test)]
mod tests {
use super::*; use crate::introducers::CSI;
#[test]
fn test_attributes() {
let sequence = attributes(42);
assert_eq!(sequence.to_string(), format!("{}42c", CSI));
}
#[test]
fn test_report_status() {
let sequence = report_status(StatusReport::Ready);
assert_eq!(sequence.to_string(), format!("{}0c", CSI));
let sequence = report_status(StatusReport::ErrorRetry);
assert_eq!(sequence.to_string(), format!("{}3c", CSI));
let sequence = report_status(StatusReport::MessageWaiting);
assert_eq!(sequence.to_string(), format!("{}5c", CSI));
}
#[test]
fn test_function_key() {
let sequence = function_key(7);
assert_eq!(sequence.to_string(), format!("{}7 W", CSI));
}
#[test]
fn test_identify_control_string() {
let sequence = identify_control_string(ControlString::SRTMDiagnose);
assert_eq!(sequence.to_string(), format!("{}1 O", CSI));
let sequence = identify_control_string(ControlString::Ecma35DCRS);
assert_eq!(sequence.to_string(), format!("{}2 O", CSI));
}
#[test]
fn test_identify_graphic_sub() {
let sequence = identify_graphic_sub(4);
assert_eq!(sequence.to_string(), format!("{}4 W", CSI));
}
#[test]
fn test_media_copy() {
let sequence = media_copy(CopyStatus::InitTo1);
assert_eq!(sequence.to_string(), format!("{}0i", CSI));
let sequence = media_copy(CopyStatus::Start2);
assert_eq!(sequence.to_string(), format!("{}7i", CSI));
}
#[test]
fn test_eject_and_feed() {
let sequence = eject_and_feed(2, 3);
assert_eq!(sequence.to_string(), format!("{}2;3 Y", CSI));
}
#[test]
fn test_status_report_display() {
assert_eq!(StatusReport::Ready.to_string(), "0");
assert_eq!(StatusReport::BusyRetry.to_string(), "1");
assert_eq!(StatusReport::ErrorRetry.to_string(), "3");
}
#[test]
fn test_control_string_display() {
assert_eq!(ControlString::SRTMDiagnose.to_string(), "1");
assert_eq!(ControlString::Ecma35DCRS.to_string(), "2");
}
#[test]
fn test_copy_status_display() {
assert_eq!(CopyStatus::InitTo1.to_string(), "0");
assert_eq!(CopyStatus::Start2.to_string(), "7");
}
}