use crate::reg::{
compare,
ErrorList::{EmptyVec, UncappedEscape},
};
use crate::term::TermStrings;
use std::fmt::Debug;
use std::io::Write;
#[derive(Debug, Clone)]
pub struct TermWriter {
writer: Vec<u8>,
}
impl Write for TermWriter {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.writer.write(buf)
}
fn flush(&mut self) -> std::io::Result<()> {
self.writer.flush()
}
}
impl TermWriter {
pub fn new() -> TermWriter {
TermWriter { writer: Vec::new() }
}
pub fn compare(self, _t: TermStrings) -> Result<bool, &'static str> {
let compare_result = compare(self.writer, _t.get_term_list());
return match compare_result {
Ok(true) => Ok(true),
Err(EmptyVec) => Err(&"Provided terminal escape sequences were empty."),
Err(UncappedEscape(x)) => {
let invalid_str: String = x;
error_print(invalid_str);
Err(&"Potential unrecognized escape sequences were found")
}
_ => Err(&"Unknown error occurred"),
};
}
}
pub fn error_print(invalid_str: String) {
let result = invalid_str;
println!("\x1b[0;31m------------------ Console Failure ------------------\n\n");
println!(
" Possible unrecognized escape sequence(s) in the input.\n Shown in brackets:\n{:?}\n\n",
result
);
println!("-----------------------------------------------------\x1b[0m");
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn vec_string_bytes() {
let vec1 = vec!["Some".to_string(), "junk".to_string(), "text".to_string()];
let joined_vec1 = vec1.join(" ");
let vec1_bytes = joined_vec1.as_bytes();
let bytes_literal = b"Some junk text";
assert_eq!(vec1_bytes, bytes_literal);
}
#[test]
fn termwriter_write() {
let bytes_literal = b"Some junk text";
let mut buffer = TermWriter::new();
let _bytes_written = match buffer.write(bytes_literal) {
Ok(bytes_written) => assert_eq!(bytes_written, 14),
Err(e) => println!("Failed writing to TermWriter object, {}", e.to_string()),
};
}
#[test]
fn termwriter_write_all() {
let bytes_literal = b"Some junk text";
let mut buffer = TermWriter::new();
assert_eq!((), buffer.write_all(bytes_literal).unwrap());
}
#[test]
fn termwriter_flush() {
let bytes_literal = b"Some junk text";
let mut buffer = TermWriter::new();
let _ = buffer.write(bytes_literal);
assert_eq!((), buffer.flush().unwrap())
}
#[test]
fn termwriter_compare() {
let mut buffer = TermWriter::new();
let _ = buffer.write(b"Text with\nTwo lines");
let result = buffer.compare(TermStrings::new_from_env());
if result.is_err() {
assert_eq!(
Err("Provided terminal escape sequences were empty."),
result,
);
} else {
assert_eq!(Ok(true), result);
}
}
}