#[cfg(feature = "external_printer")]
use {
crossbeam::channel::{bounded, Receiver, SendError, Sender},
std::fmt::Display,
};
#[cfg(feature = "external_printer")]
pub const EXTERNAL_PRINTER_DEFAULT_CAPACITY: usize = 20;
#[cfg(feature = "external_printer")]
#[derive(Debug, Clone)]
pub struct ExternalPrinter<T>
where
T: Display,
{
sender: Sender<T>,
receiver: Receiver<T>,
}
#[cfg(feature = "external_printer")]
impl<T> ExternalPrinter<T>
where
T: Display,
{
pub fn new(max_cap: usize) -> Self {
let (sender, receiver) = bounded::<T>(max_cap);
Self { sender, receiver }
}
pub fn sender(&self) -> Sender<T> {
self.sender.clone()
}
pub fn receiver(&self) -> &Receiver<T> {
&self.receiver
}
pub fn print(&self, line: T) -> Result<(), SendError<T>> {
self.sender.send(line)
}
pub fn get_line(&self) -> Option<T> {
self.receiver.try_recv().ok()
}
}
#[cfg(feature = "external_printer")]
impl<T> Default for ExternalPrinter<T>
where
T: Display,
{
fn default() -> Self {
Self::new(EXTERNAL_PRINTER_DEFAULT_CAPACITY)
}
}