use crate::event::Event;
use crate::pipeline::EventParser;
use anyhow::Result;
use rhai::Dynamic;
pub struct LineParser;
impl LineParser {
pub fn new() -> Self {
Self
}
}
impl EventParser for LineParser {
fn parse(&self, line: &str) -> Result<Event> {
let line = line.trim_end_matches('\n').trim_end_matches('\r');
let mut event = Event::with_capacity(line.to_string(), 1);
event.set_field("line".to_string(), Dynamic::from(line.to_string()));
Ok(event)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::pipeline::EventParser;
#[test]
fn test_line_parser_basic() {
let parser = LineParser::new();
let test_line = "This is a simple log line";
let result = EventParser::parse(&parser, test_line).unwrap();
assert!(result.fields.get("line").is_some());
assert_eq!(
result
.fields
.get("line")
.unwrap()
.clone()
.into_string()
.unwrap(),
test_line
);
assert_eq!(result.original_line, test_line);
assert_eq!(result.parsed_ts, None);
}
#[test]
fn test_line_parser_with_structure() {
let parser = LineParser::new();
let test_line = "2023-01-01 ERROR Failed to connect";
let result = EventParser::parse(&parser, test_line).unwrap();
assert!(result.fields.get("line").is_some());
assert_eq!(
result
.fields
.get("line")
.unwrap()
.clone()
.into_string()
.unwrap(),
test_line
);
assert_eq!(result.original_line, test_line);
assert_eq!(result.parsed_ts, None);
}
}