tree_sitter_cli/fuzz/
random.rs1use rand::{
2 distributions::Alphanumeric,
3 prelude::{Rng, SeedableRng, StdRng},
4};
5
6const OPERATORS: &[char] = &[
7 '+', '-', '<', '>', '(', ')', '*', '/', '&', '|', '!', ',', '.', '%',
8];
9
10pub struct Rand(StdRng);
11
12impl Rand {
13 #[must_use]
14 pub fn new(seed: usize) -> Self {
15 Self(StdRng::seed_from_u64(seed as u64))
16 }
17
18 pub fn unsigned(&mut self, max: usize) -> usize {
19 self.0.gen_range(0..=max)
20 }
21
22 pub fn words(&mut self, max_count: usize) -> Vec<u8> {
23 let mut result = Vec::new();
24 let word_count = self.unsigned(max_count);
25 for i in 0..word_count {
26 if i > 0 {
27 if self.unsigned(5) == 0 {
28 result.push(b'\n');
29 } else {
30 result.push(b' ');
31 }
32 }
33 if self.unsigned(3) == 0 {
34 let index = self.unsigned(OPERATORS.len() - 1);
35 result.push(OPERATORS[index] as u8);
36 } else {
37 for _ in 0..self.unsigned(8) {
38 result.push(self.0.sample(Alphanumeric));
39 }
40 }
41 }
42 result
43 }
44}