2022-05-17 20:28:18 +02:00
|
|
|
use std::io::{Result, Write};
|
2022-03-16 23:21:06 +01:00
|
|
|
|
|
|
|
pub fn enable_vt_processing() -> Result<()> {
|
|
|
|
#[cfg(windows)]
|
|
|
|
{
|
|
|
|
use crossterm_winapi::{ConsoleMode, Handle};
|
|
|
|
|
|
|
|
pub const ENABLE_PROCESSED_OUTPUT: u32 = 0x0001;
|
|
|
|
pub const ENABLE_VIRTUAL_TERMINAL_PROCESSING: u32 = 0x0004;
|
|
|
|
// let mask = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
|
|
|
|
|
|
|
|
let console_mode = ConsoleMode::from(Handle::current_out_handle()?);
|
|
|
|
let old_mode = console_mode.mode()?;
|
|
|
|
|
|
|
|
// researching odd ansi behavior in windows terminal repo revealed that
|
|
|
|
// enable_processed_output and enable_virtual_terminal_processing should be used
|
|
|
|
// also, instead of checking old_mode & mask, just set the mode already
|
|
|
|
|
|
|
|
// if old_mode & mask == 0 {
|
|
|
|
console_mode
|
|
|
|
.set_mode(old_mode | ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING)?;
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
2022-05-17 20:28:18 +02:00
|
|
|
|
|
|
|
pub fn stdout_write_all_and_flush(output: String) -> Result<()> {
|
|
|
|
let stdout = std::io::stdout();
|
|
|
|
let ret = match stdout.lock().write_all(output.as_bytes()) {
|
|
|
|
Ok(_) => Ok(stdout.lock().flush()?),
|
|
|
|
Err(err) => Err(err),
|
|
|
|
};
|
|
|
|
|
|
|
|
ret
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn stdout_write_all_as_binary_and_flush(output: &[u8]) -> Result<()> {
|
|
|
|
let stdout = std::io::stdout();
|
|
|
|
let ret = match stdout.lock().write_all(output) {
|
|
|
|
Ok(_) => Ok(stdout.lock().flush()?),
|
|
|
|
Err(err) => Err(err),
|
|
|
|
};
|
|
|
|
|
|
|
|
ret
|
|
|
|
}
|