use crate::error::ParseError;
use crate::lexer::{fields_on_line, FieldRef, LineIter, LineView, LogDialect};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct BorrowedRecord<'src> {
pub line: LineView<'src>,
pub fields: Vec<FieldRef<'src>>,
}
pub struct LogStream<'src> {
lines: LineIter<'src>,
dialect: LogDialect,
}
impl<'src> LogStream<'src> {
pub fn new(bytes: &'src [u8], dialect: LogDialect, max_line_bytes: Option<usize>) -> Self {
Self {
lines: LineIter::new(bytes, max_line_bytes),
dialect,
}
}
}
impl<'src> Iterator for LogStream<'src> {
type Item = Result<BorrowedRecord<'src>, ParseError>;
fn next(&mut self) -> Option<Self::Item> {
let line = match self.lines.next()? {
Ok(l) => l,
Err(e) => return Some(Err(e)),
};
let fields = fields_on_line(line, self.dialect);
Some(Ok(BorrowedRecord { line, fields }))
}
}
pub fn parse_log_stream<'src>(
src: &'src str,
dialect: LogDialect,
max_line_bytes: Option<usize>,
) -> LogStream<'src> {
LogStream::new(src.as_bytes(), dialect, max_line_bytes)
}