use std::fmt::{Display, Formatter};
use crate::introducers::CSI;
#[derive(Clone)]
pub struct ControlSequence {
arguments: Vec<String>,
end: String,
}
impl ControlSequence {
pub fn new(from: &[&str], end: &str) -> Self {
ControlSequence { arguments: from.iter().map(|s| s.to_string()).collect::<Vec<_>>(), end: end.to_string() }
}
pub fn exec(&self) {
use std::io::stdout;
use std::io::Write;
print!("{}", self);
stdout().flush().unwrap()
}
}
impl Display for ControlSequence {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}{}{}", CSI, self.arguments.join(";"), self.end)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::introducers::CSI;
#[test]
fn test_control_sequence_new() {
let sequence = ControlSequence::new(&["1", "1"], "H");
assert_eq!(sequence.arguments, vec!["1".to_string(), "1".to_string()]);
assert_eq!(sequence.end, "H".to_string());
}
#[test]
fn test_control_sequence_display() {
let sequence = ControlSequence::new(&["1", "1"], "H");
let expected_output = format!("{}1;1H", CSI);
assert_eq!(sequence.to_string(), expected_output);
}
}