use std::fs::File;
use std::path::Path;
use evtx::{EvtxParser, ParserSettings};
use serde_json::Value;
#[derive(Debug, thiserror::Error)]
#[error(transparent)]
pub struct EvtxError(#[from] evtx::err::EvtxError);
pub struct EvtxFileReader {
parser: EvtxParser<File>,
}
impl EvtxFileReader {
pub fn open(path: impl AsRef<Path>) -> Result<Self, EvtxError> {
let settings = ParserSettings::default().num_threads(1);
let parser = EvtxParser::from_path(path)?.with_configuration(settings);
Ok(Self { parser })
}
pub fn records(&mut self) -> impl Iterator<Item = Result<Value, EvtxError>> + '_ {
self.parser
.records_json_value()
.map(|r| r.map(|rec| rec.data).map_err(EvtxError::from))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn open_nonexistent_returns_error() {
let result = EvtxFileReader::open("/nonexistent/file.evtx");
assert!(result.is_err());
}
}