use-match 0.1.0

Shared match-result primitives for RustUse pattern helpers
Documentation
use use_match::{
    MatchSpan, TextMatch, contains_match, first_match, is_match_span_valid, last_match,
    match_is_empty, match_len, slice_match,
};

fn sample_matches() -> Vec<TextMatch> {
    vec![
        TextMatch {
            value: "alpha".to_string(),
            span: MatchSpan { start: 0, end: 5 },
        },
        TextMatch {
            value: "beta".to_string(),
            span: MatchSpan { start: 6, end: 10 },
        },
    ]
}

#[test]
fn validates_a_match_span() {
    let span = MatchSpan { start: 0, end: 4 };

    assert!(is_match_span_valid("rust", &span));
}

#[test]
fn rejects_invalid_match_spans() {
    assert!(!is_match_span_valid(
        "rust",
        &MatchSpan { start: 4, end: 2 }
    ));
    assert!(!is_match_span_valid(
        "rust",
        &MatchSpan { start: 0, end: 8 }
    ));
    assert!(!is_match_span_valid(
        "éclair",
        &MatchSpan { start: 1, end: 2 }
    ));
}

#[test]
fn slices_a_match() {
    let span = MatchSpan { start: 0, end: 4 };

    assert_eq!(slice_match("rustacean", &span), Some("rust"));
}

#[test]
fn handles_empty_match_spans() {
    let span = MatchSpan { start: 2, end: 2 };

    assert!(match_is_empty(&span));
    assert_eq!(slice_match("rust", &span), Some(""));
}

#[test]
fn reports_match_length() {
    assert_eq!(match_len(&MatchSpan { start: 2, end: 7 }), 5);
    assert_eq!(match_len(&MatchSpan { start: 7, end: 2 }), 0);
}

#[test]
fn returns_first_and_last_matches() {
    let matches = sample_matches();

    assert_eq!(
        first_match(&matches).map(|item| item.value.as_str()),
        Some("alpha")
    );
    assert_eq!(
        last_match(&matches).map(|item| item.value.as_str()),
        Some("beta")
    );
}

#[test]
fn detects_contained_match_values() {
    let matches = sample_matches();

    assert!(contains_match(&matches, "alpha"));
    assert!(!contains_match(&matches, "gamma"));
}

#[test]
fn handles_empty_input() {
    let matches: Vec<TextMatch> = Vec::new();
    let span = MatchSpan { start: 0, end: 0 };

    assert!(is_match_span_valid("", &span));
    assert_eq!(slice_match("", &span), Some(""));
    assert!(first_match(&matches).is_none());
    assert!(last_match(&matches).is_none());
    assert!(!contains_match(&matches, "anything"));
}