use-csv 0.1.0

Lightweight CSV delimiter, row, and field helpers for RustUse
Documentation
use use_csv::{
    count_csv_columns, csv_escape_field, csv_join_row, detect_delimiter, looks_like_csv,
    parse_csv_basic, split_csv_line_basic,
};

#[test]
fn detects_delimiters() {
    assert_eq!(detect_delimiter("name;enabled\nRustUse;true\n"), Some(';'));
    assert_eq!(
        detect_delimiter("name\tenabled\nRustUse\ttrue\n"),
        Some('\t')
    );
    assert!(looks_like_csv("a,b\n1,2\n"));
}

#[test]
fn splits_rows_and_counts_columns() {
    assert_eq!(split_csv_line_basic("a,\"b,c\",d"), vec!["a", "b,c", "d"]);
    assert_eq!(count_csv_columns("a|b|c"), 3);
}

#[test]
fn escapes_and_joins_fields() {
    assert_eq!(csv_escape_field("two,three"), "\"two,three\"");
    assert_eq!(
        csv_join_row(&["one", "two,three", "four"]),
        "one,\"two,three\",four"
    );
}

#[test]
fn parses_basic_csv() {
    let rows = parse_csv_basic("name,enabled\nRustUse,true\n");
    assert_eq!(rows.len(), 2);
    assert_eq!(rows[1].line, 2);
    assert_eq!(rows[1].fields[0], "RustUse");
}

#[test]
fn handles_malformed_input_gracefully() {
    assert_eq!(
        split_csv_line_basic("\"unterminated,field"),
        vec!["unterminated,field"]
    );
}

#[test]
fn handles_empty_input() {
    assert!(!looks_like_csv("   \n"));
    assert!(parse_csv_basic("").is_empty());
    assert_eq!(count_csv_columns(""), 0);
}