2024-01-23 16:40:07 +08:00
|
|
|
use std::io::{Read, Write};
|
|
|
|
|
|
|
|
use entry::Entry;
|
|
|
|
|
|
|
|
pub mod entry;
|
|
|
|
mod error;
|
|
|
|
pub mod layer;
|
|
|
|
pub mod processor;
|
|
|
|
|
|
|
|
pub use error::Error;
|
|
|
|
|
2024-02-01 00:44:54 +08:00
|
|
|
pub struct TraceWriter<W: Write> {
|
2024-01-23 16:40:07 +08:00
|
|
|
writer: W,
|
2024-01-23 23:52:48 +08:00
|
|
|
receiver: tokio::sync::mpsc::UnboundedReceiver<Entry>,
|
2024-01-23 16:40:07 +08:00
|
|
|
}
|
|
|
|
|
2024-02-01 00:44:54 +08:00
|
|
|
pub struct Trace {
|
|
|
|
receiver: tokio::sync::mpsc::UnboundedReceiver<Entry>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Trace {
|
|
|
|
pub fn into_receiver(self) -> tokio::sync::mpsc::UnboundedReceiver<Entry> {
|
|
|
|
self.receiver
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn into_writer<W: Write>(self, writer: W) -> TraceWriter<W> {
|
|
|
|
TraceWriter { writer, receiver: self.receiver }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-01-23 16:40:07 +08:00
|
|
|
pub struct TraceReader<R: Read> {
|
|
|
|
reader: R,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<R: Read> TraceReader<R> {
|
|
|
|
pub fn new(reader: R) -> Self {
|
|
|
|
Self { reader }
|
|
|
|
}
|
|
|
|
|
|
|
|
fn read(&mut self) -> Option<Result<Entry, Error>> {
|
|
|
|
serde_json::Deserializer::from_reader(&mut self.reader)
|
|
|
|
.into_iter()
|
|
|
|
.next()
|
|
|
|
.map(|res| res.map_err(Into::into))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<R: Read> Iterator for TraceReader<R> {
|
|
|
|
type Item = Result<Entry, Error>;
|
|
|
|
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
|
|
self.read()
|
|
|
|
}
|
|
|
|
}
|