random_char_iter.rs

 1use rand::prelude::*;
 2
 3pub struct RandomCharIter<T: Rng>(T);
 4
 5impl<T: Rng> RandomCharIter<T> {
 6    pub fn new(rng: T) -> Self {
 7        Self(rng)
 8    }
 9}
10
11impl<T: Rng> Iterator for RandomCharIter<T> {
12    type Item = char;
13
14    fn next(&mut self) -> Option<Self::Item> {
15        if std::env::var("SIMPLE_TEXT").map_or(false, |v| !v.is_empty()) {
16            return if self.0.gen_range(0..100) < 5 {
17                Some('\n')
18            } else {
19                Some(self.0.gen_range(b'a'..b'z' + 1).into())
20            };
21        }
22
23        match self.0.gen_range(0..100) {
24            // whitespace
25            0..=19 => [' ', '\n', '\r', '\t'].choose(&mut self.0).copied(),
26            // two-byte greek letters
27            20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
28            // // three-byte characters
29            33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
30            // // four-byte characters
31            46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
32            // ascii letters
33            _ => Some(self.0.gen_range(b'a'..b'z' + 1).into()),
34        }
35    }
36}