perl-module-reference 0.12.2

Find Perl module references under the cursor on use/require lines
Documentation
use perl_module_reference::{extract_module_reference, find_module_reference};

fn next_u64(state: &mut u64) -> u64 {
    *state ^= *state >> 12;
    *state ^= *state << 25;
    *state ^= *state >> 27;
    state.wrapping_mul(0x2545F4914F6CDD1D)
}

fn fuzz_string(state: &mut u64, max_len: usize) -> String {
    let len = (next_u64(state) as usize % max_len).saturating_add(1);
    let mut out = String::with_capacity(len);

    for _ in 0..len {
        let byte = (next_u64(state) & 0x7F) as u8;
        let ch = match byte {
            0..=31 => ' ',
            _ => byte as char,
        };
        out.push(ch);
    }

    out
}

#[test]
fn fuzz_reference_extraction_never_panics_and_emits_consistent_ranges() {
    let mut seed = 0xBAD5EED_u64;

    for _ in 0..3000 {
        let text = fuzz_string(&mut seed, 256);
        let cursor = (next_u64(&mut seed) as usize) % (text.len().saturating_add(1));

        let found = find_module_reference(&text, cursor);
        if let Some(reference) = found {
            assert!(reference.module_start <= reference.module_end);
            assert!(reference.module_end <= text.len());
            assert!(!reference.module_name.is_empty());
            assert_eq!(reference.module_name, &text[reference.module_start..reference.module_end]);

            let extracted = extract_module_reference(&text, cursor);
            assert!(extracted.is_some());
        } else {
            let extracted = extract_module_reference(&text, cursor);
            assert!(extracted.is_none());
        }
    }
}