use std::io::{self, Write};
use std::sync::{Arc, Mutex, MutexGuard};
pub type LogOutputFactory = Box<Fn() -> Box<Write> + Send + Sync>;
pub struct SyncWriteAdapter<T: Write> {
writer: Arc<Mutex<T>>,
}
impl<T: Write + Send + 'static> SyncWriteAdapter<T> {
pub fn new(writer: T) -> Self {
SyncWriteAdapter {
writer: Arc::new(Mutex::new(writer)),
}
}
pub fn lock(&self) -> MutexGuard<T> {
self.writer.lock().unwrap()
}
}
impl<T: Write + Send + 'static> Write for SyncWriteAdapter<T> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
let mut lock = self.writer.lock().unwrap();
lock.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
let mut lock = self.writer.lock().unwrap();
lock.flush()
}
}
impl<T: Write + Send + 'static> Clone for SyncWriteAdapter<T> {
fn clone(&self) -> Self {
SyncWriteAdapter {
writer: self.writer.clone(),
}
}
}
pub fn new_log_output_factory<T: Write + Send + 'static>(writer: T) -> LogOutputFactory {
let writer: SyncWriteAdapter<T> = SyncWriteAdapter::new(writer);
Box::new(move || Box::new(writer.clone()))
}