use std::sync::Arc;
use crate::{SafeRawTerminal, SendRawTerminal, StdMutex};
pub type LockedOutputDevice<'a> = &'a mut dyn std::io::Write;
#[macro_export]
macro_rules! output_device_as_mut {
($device:expr) => {
&mut *$device.lock()
};
}
#[derive(Clone)]
pub struct OutputDevice {
pub resource: SafeRawTerminal,
pub is_mock: bool,
}
impl OutputDevice {
pub fn new_stdout() -> Self {
Self {
resource: Arc::new(StdMutex::new(std::io::stdout())),
is_mock: false,
}
}
}
impl OutputDevice {
pub fn lock(&self) -> std::sync::MutexGuard<'_, SendRawTerminal> {
self.resource.lock().unwrap()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{output_device_as_mut, LockedOutputDevice};
#[test]
fn test_stdout_output_device() {
let output_device = OutputDevice::new_stdout();
let mut_ref: LockedOutputDevice<'_> = output_device_as_mut!(output_device);
let _ = mut_ref.write_all(b"Hello, world!\n");
assert!(!output_device.is_mock);
}
#[test]
fn test_stdout_output_device_is_not_mock() {
let device = OutputDevice::new_stdout();
assert!(!device.is_mock);
}
}