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}