use memory_safe_parser::{LineView, LogDialect, MappedFile};
use std::env;
use std::path::PathBuf;
fn main() -> std::io::Result<()> {
let path = match env::args_os().nth(1) {
Some(p) => PathBuf::from(p),
None => PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("testdata/sample.log"),
};
let mapped = MappedFile::map_path(&path)?;
let stream = mapped.log_stream(LogDialect::default(), Some(512 * 1024));
let mut lines = 0u64;
let mut fields = 0u64;
for rec in stream {
let rec = rec.expect("parse line");
lines += 1;
fields += rec.fields.len() as u64;
if lines == 1 {
eprintln!(
"{}: first line byte_offset={} preview={}",
path.display(),
rec.line.byte_offset,
summarize_line(rec.line),
);
}
}
println!("lines={lines} fields={fields}");
Ok(())
}
fn summarize_line(lv: LineView<'_>) -> String {
let preview: String = lv.text.chars().take(120).collect();
format!("{preview:?}")
}