use std::borrow::Cow;
#[ctor::ctor(unsafe)]
fn init() {
console::set_colors_enabled(false);
console::set_colors_enabled_stderr(false);
}
pub fn without_ansi(s: &str) -> Cow<'_, str> {
console::strip_ansi_codes(s)
}
#[cfg(unix)]
pub use capture::{capture_term, snapshot};
#[cfg(unix)]
mod capture {
use console::Term;
use std::fs::{File, OpenOptions};
use std::io::Write;
use std::os::fd::{AsRawFd, RawFd};
use std::sync::{Arc, Mutex};
#[derive(Debug)]
pub struct CaptureWriter {
_fd: File,
bytes: Arc<Mutex<Vec<u8>>>,
}
impl Write for CaptureWriter {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.bytes.lock().unwrap().extend_from_slice(buf);
Ok(buf.len())
}
fn flush(&mut self) -> std::io::Result<()> {
Ok(())
}
}
impl AsRawFd for CaptureWriter {
fn as_raw_fd(&self) -> RawFd {
self._fd.as_raw_fd()
}
}
pub fn capture_term() -> (Term, Arc<Mutex<Vec<u8>>>) {
let bytes = Arc::new(Mutex::new(Vec::new()));
let writer = CaptureWriter {
_fd: OpenOptions::new().write(true).open("/dev/null").unwrap(),
bytes: Arc::clone(&bytes),
};
let reader = File::open("/dev/null").unwrap();
(Term::read_write_pair(reader, writer), bytes)
}
pub fn snapshot(buf: &Arc<Mutex<Vec<u8>>>) -> Vec<u8> {
buf.lock().unwrap().clone()
}
}