tpt-logfmt-parse 0.1.0

Zero-copy, high-performance logfmt (key=value) parser with no dependencies
Documentation
use tpt_logfmt_parse::{parse_to_map, LogfmtParser};

#[test]
fn integration_heroku_log_line() {
    let line =
        r#"at=info method=GET path="/api/v1/users" host=example.com status=200 duration=12ms"#;
    let map = parse_to_map(line).unwrap();
    assert_eq!(map["at"], "info");
    assert_eq!(map["method"], "GET");
    assert_eq!(map["path"], "/api/v1/users");
    assert_eq!(map["status"], "200");
    assert_eq!(map["duration"], "12ms");
}

#[test]
fn integration_zero_copy_iterator_collects_all() {
    let line = "ts=2024-01-01T00:00:00Z level=warn caller=main.go:42 msg=timeout";
    let pairs: Vec<_> = LogfmtParser::new(line).collect::<Result<_, _>>().unwrap();
    assert_eq!(pairs.len(), 4);
    assert_eq!(pairs[0], ("ts", "2024-01-01T00:00:00Z"));
    assert_eq!(pairs[1], ("level", "warn"));
    assert_eq!(pairs[2], ("caller", "main.go:42"));
    assert_eq!(pairs[3], ("msg", "timeout"));
}

#[test]
fn integration_multiple_bare_keys() {
    let line = "debug verbose quiet level=info";
    let pairs: Vec<_> = LogfmtParser::new(line).collect::<Result<_, _>>().unwrap();
    assert_eq!(pairs[0], ("debug", ""));
    assert_eq!(pairs[1], ("verbose", ""));
    assert_eq!(pairs[2], ("quiet", ""));
    assert_eq!(pairs[3], ("level", "info"));
}

#[test]
fn integration_empty_quoted_value() {
    let line = r#"key="" other=val"#;
    let map = parse_to_map(line).unwrap();
    assert_eq!(map["key"], "");
    assert_eq!(map["other"], "val");
}

#[test]
fn integration_escape_newline_tab() {
    let line = r#"msg="line1\nline2\ttabbed""#;
    let map = parse_to_map(line).unwrap();
    assert_eq!(map["msg"], "line1\nline2\ttabbed");
}