use crate::formatters::{json::JsonFormatter, LogFormatter};
use crate::parse_log_line;
use std::error::Error;
use std::fs;
use std::io::{BufRead, BufReader};
pub struct FileProcessor {
formatter: Box<dyn LogFormatter>,
}
impl FileProcessor {
pub fn new() -> Self {
Self {
formatter: Box::new(JsonFormatter::new()),
}
}
pub fn process_file(&self, file_path: &str) -> Result<String, Box<dyn Error>> {
let file = fs::File::open(file_path)?;
let reader = BufReader::new(file);
let mut results = Vec::new();
let mut line_number = 0;
for line in reader.lines() {
let line = line?;
line_number += 1;
if line.trim().is_empty() {
continue;
}
let parse_result = parse_log_line(&line);
results.push((line_number, line, parse_result));
}
self.formatter.format_multiple(results)
}
pub fn process_files(&self, file_paths: &[String]) -> Result<String, Box<dyn Error>> {
let mut all_results = Vec::new();
for file_path in file_paths {
let file = fs::File::open(file_path)?;
let reader = BufReader::new(file);
let mut line_number = 0;
for line in reader.lines() {
let line = line?;
line_number += 1;
if line.trim().is_empty() {
continue;
}
let parse_result = parse_log_line(&line);
all_results.push((line_number, line, parse_result));
}
}
self.formatter.format_multiple(all_results)
}
pub fn process_line(&self, line: &str, line_number: usize) -> Result<String, Box<dyn Error>> {
let parse_result = parse_log_line(line);
self.formatter
.format_single(line_number, line, &parse_result)
}
}
impl Default for FileProcessor {
fn default() -> Self {
Self::new()
}
}