use crate::util::async_manager;
use async_channel::Sender;
use tracing_subscriber::fmt::MakeWriter;
pub struct ChannelWriter {
log_sender: Sender<Vec<u8>>,
}
impl ChannelWriter {
pub fn new(sender: Sender<Vec<u8>>) -> Self {
Self { log_sender: sender }
}
}
impl std::io::Write for ChannelWriter {
fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
let sender = self.log_sender.clone();
let len = buf.len();
let send_buf = buf.to_vec();
async_manager::spawn(async move {
let _ = sender.send(send_buf.to_vec()).await;
})
.unwrap();
Ok(len)
}
fn flush(&mut self) -> Result<(), std::io::Error> {
Ok(())
}
}
impl MakeWriter for ChannelWriter {
type Writer = ChannelWriter;
fn make_writer(&self) -> Self::Writer {
ChannelWriter::new(self.log_sender.clone())
}
}