use crate::generator::generate;
use crate::Syllable::{self, *};
pub struct Gabble {
pub start: Syllable,
pub end: Syllable,
pub length: Option<usize>,
}
impl Gabble {
pub fn new() -> Self {
Self {
start: Alphabet,
end: Consonant,
length: None,
}
}
pub fn with_length(mut self, n: usize) -> Self {
if n < 3 {
panic!("provide appropriate length");
}
self.length = Some(n);
self
}
pub fn starts_with(mut self, syllable: Syllable) -> Self {
self.start = syllable;
self
}
pub fn ends_with(mut self, syllable: Syllable) -> Self {
self.end = syllable;
self
}
pub fn generate<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> String {
generate(rng, self.start.clone(), self.end.clone(), self.length)
}
}
impl Default for Gabble {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
#[test]
pub fn gabble() {
use crate::Gabble;
use crate::Syllable::*;
use rand::rng;
let mut rng = rng();
let gib = Gabble::new()
.with_length(6)
.starts_with(Alphabet)
.ends_with(Consonant);
let word = gib.generate(&mut rng);
assert!(!word.is_empty());
println!("gabble {}", word);
}
}