Mem_Parser 0.1.0

Zero-copy log parser with mmap input, streaming lines, and optional bump arena AST
Documentation
//! Memory-map a log file and count lines / key-value fields.
//!
//! ```text
//! cargo run --example mmap_stream
//! cargo run --example mmap_stream -- path/to/your.log
//! ```

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:?}")
}