perl-workspace-folder 0.12.2

Parse Perl workspace folder declarations into filesystem paths
Documentation
use perl_workspace_folder::workspace_folder_to_path;

#[derive(Debug)]
struct XorShift64 {
    state: u64,
}

impl XorShift64 {
    fn new(seed: u64) -> Self {
        Self { state: seed }
    }

    fn next_u64(&mut self) -> u64 {
        let mut value = self.state;
        value ^= value << 13;
        value ^= value >> 7;
        value ^= value << 17;
        self.state = value;
        value
    }
}

fn fuzz_string(state: &mut XorShift64, max_len: usize) -> String {
    let len = (state.next_u64() as usize % max_len).saturating_add(1);
    const ALPHABET: &[u8] = b"abcdefghijklmnopqrstuvwxyz/::._ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789%";
    let mut out = String::with_capacity(len);

    for _ in 0..len {
        let idx = (state.next_u64() as usize) % ALPHABET.len();
        out.push(ALPHABET[idx] as char);
    }

    out
}

#[test]
fn fuzz_workspace_folder_inputs_do_not_panic_or_produce_file_uris() {
    let mut rng = XorShift64::new(0x5EED_BEEF_DEAD_BEEF);

    for _ in 0..2_500 {
        let input = fuzz_string(&mut rng, 48);
        let parsed = workspace_folder_to_path(&input);

        assert!(!parsed.to_string_lossy().contains("file://"));
    }
}