gabble 0.2.0

Library crate for generating random pseudo-words
Documentation
use crate::Syllable;
use crate::{FINALS, INITIALS, VOWELS};
use rand::seq::IndexedRandom;

pub fn generate<R: rand::Rng + ?Sized>(
    rng: &mut R,
    start: Syllable,
    end: Syllable,
    length: Option<usize>,
) -> String {
    let mut curr_length = 0;
    let mut syllables = Vec::new();
    let approx_length = length.unwrap_or_else(|| rng.random_range(7..9));
    let mut final_string = String::with_capacity(approx_length + 5);

    while curr_length < approx_length {
        let v = *VOWELS.choose(rng).unwrap();
        curr_length += v.len();
        syllables.push(v);
        let f = *FINALS.choose(rng).unwrap();
        curr_length += f.len();
        syllables.push(f);
    }

    match start {
        Syllable::Consonant => final_string += INITIALS.choose(rng).unwrap(),
        Syllable::Alphabet => {
            if rng.random_bool(0.65) {
                final_string += INITIALS.choose(rng).unwrap()
            }
        }
        Syllable::Vowel => (),
    }

    syllables.into_iter().for_each(|s| final_string += s);

    match end {
        Syllable::Consonant => (),
        Syllable::Alphabet => {
            if rng.random_bool(0.35) {
                final_string += VOWELS.choose(rng).unwrap()
            }
        }
        Syllable::Vowel => final_string += VOWELS.choose(rng).unwrap(),
    }

    final_string
}