Skip to content

Commit 0829bb6

Browse files
committed
fix(generator): use same generator for all data
1 parent 87de8f0 commit 0829bb6

3 files changed

Lines changed: 54 additions & 26 deletions

File tree

src/data_generator.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
//! Wrapper around [`DataGenerator`] for internal usage.
22
3+
use rand::Rng as _;
4+
use rand::distr::uniform::{SampleRange, SampleUniform};
35
use rand::rngs::ThreadRng;
6+
use rand::seq::IndexedRandom as _;
47
use rand_chacha::ChaCha20Rng;
58
use random_data::{DataGenerator, DataType};
69

@@ -15,6 +18,14 @@ pub enum RandomDataGenerator {
1518
}
1619

1720
impl RandomDataGenerator {
21+
/// Chooses an element from a slice with the random generator
22+
pub fn choose<'values, T>(&mut self, values: &'values [T]) -> Option<&'values T> {
23+
match self {
24+
Self::NonDeterministic(data_generator) => values.choose(data_generator.rng()),
25+
Self::Seeded(data_generator) => values.choose(data_generator.rng()),
26+
}
27+
}
28+
1829
/// Creates a new [`RandomDataGenerator`] with a seed or not.
1930
pub fn new(seed: Option<u64>) -> Self {
2031
seed.map_or_else(
@@ -23,6 +34,26 @@ impl RandomDataGenerator {
2334
)
2435
}
2536

37+
/// Chooses a boolean with the given weight with the random generator
38+
pub fn random_bool(&mut self, weight: f64) -> bool {
39+
match self {
40+
Self::NonDeterministic(generator) => generator.rng().random_bool(weight),
41+
Self::Seeded(generator) => generator.rng().random_bool(weight),
42+
}
43+
}
44+
45+
/// Chooses an element from a range with the random generator
46+
pub fn random_range<T, R>(&mut self, range: R) -> T
47+
where
48+
T: SampleUniform,
49+
R: SampleRange<T>,
50+
{
51+
match self {
52+
Self::NonDeterministic(generator) => generator.rng().random_range(range),
53+
Self::Seeded(generator) => generator.rng().random_range(range),
54+
}
55+
}
56+
2657
/// Generates a value randomly from the given [`DataType`]
2758
pub fn random_value(&mut self, data_type: DataType) -> String {
2859
match self {

src/generator.rs

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ use core::hash::{Hash, Hasher};
44
use core::mem::discriminant;
55
use std::collections::{HashMap, HashSet};
66

7-
use rand::rngs::ThreadRng;
8-
use rand::seq::IndexedRandom as _;
9-
use rand::{Rng as _, rng};
7+
use rand::distr::uniform::{SampleRange, SampleUniform};
108
use random_data::DataType;
119
use serde_json::{Number, Value};
1210

@@ -30,15 +28,13 @@ pub trait NullableGenerator<T>: Sized {
3028
/// Contains the list of data types and the random generator to apply
3129
/// generators.
3230
pub struct Data {
33-
/// Radnom data generator
34-
random_data_generator: RandomDataGenerator,
3531
/// Pseudo-random refs
3632
///
3733
/// This represents data that is randomly generated once, then used in
3834
/// multiple place.
3935
refs: HashMap<String, OutputData>,
40-
/// Random generator
41-
rng: ThreadRng,
36+
/// Radnom data generator
37+
rng: RandomDataGenerator,
4238
/// Data types that were required to be unique.
4339
uniq_types: HashMap<String, HashSet<OutputData>>,
4440
/// User-defined data types
@@ -65,20 +61,20 @@ impl Data {
6561

6662
let value = if let Some(values) = self.user_defined.get(data_type) {
6763
OutputData::String(
68-
values
69-
.choose(&mut self.rng)
64+
self.rng
65+
.choose(values)
7066
.ok_or(Error::FakerDefEmpty)?
7167
.to_owned(),
7268
)
7369
} else if data_type == "Bool" {
7470
OutputData::Bool(self.rng.random_bool(0.5))
7571
} else if data_type == "Int" {
76-
OutputData::Int(self.rng.random_range(0..=u64::MAX))
72+
OutputData::Int(self.random_range(0..=u64::MAX))
7773
} else if data_type == "Float" {
78-
OutputData::Float(self.rng.random_range(0.0f64..=f64::MAX))
74+
OutputData::Float(self.random_range(0.0f64..=f64::MAX))
7975
} else {
8076
OutputData::String(
81-
self.random_data_generator.random_value(
77+
self.rng.random_value(
8278
DataType::try_from(data_type)
8379
.map_err(|()| Error::InvalidDataType(data_type.to_owned()))?,
8480
),
@@ -94,8 +90,8 @@ impl Data {
9490
.split('|')
9591
.filter(|x| !x.is_empty())
9692
.collect::<Vec<_>>();
97-
values
98-
.choose(self.rng())
93+
self.rng
94+
.choose(&values)
9995
.ok_or(Error::MissingValueBeforePipe)
10096
.map(|data| OutputData::String((*data).to_owned()))
10197
}
@@ -128,7 +124,7 @@ impl Data {
128124
u64::MAX
129125
};
130126

131-
return Ok(OutputData::Int(self.rng().random_range(min..max)));
127+
return Ok(OutputData::Int(self.random_range(min..max)));
132128
}
133129
match min_str.parse() {
134130
Ok(min) => {
@@ -139,7 +135,7 @@ impl Data {
139135
} else {
140136
f64::MAX
141137
};
142-
Ok(OutputData::Float(self.rng().random_range(min..max)))
138+
Ok(OutputData::Float(self.random_range(min..max)))
143139
}
144140
Err(error) => Err(Error::invalid_bounds(|| min_str.to_owned())(error)),
145141
}
@@ -214,9 +210,8 @@ impl Data {
214210
}
215211

216212
Ok(Self {
217-
random_data_generator: RandomDataGenerator::new(seed),
213+
rng: RandomDataGenerator::new(seed),
218214
user_defined,
219-
rng: rng(),
220215
refs: HashMap::new(),
221216
uniq_types: HashMap::new(),
222217
})
@@ -246,9 +241,13 @@ impl Data {
246241
self.rng.random_bool(0.3)
247242
}
248243

249-
/// Borrows the random generator as mutable.
250-
pub const fn rng(&mut self) -> &mut ThreadRng {
251-
&mut self.rng
244+
/// Chooses an element from a range with the random generator
245+
pub fn random_range<T, R>(&mut self, range: R) -> T
246+
where
247+
T: SampleUniform,
248+
R: SampleRange<T>,
249+
{
250+
self.rng.random_range(range)
252251
}
253252

254253
/// List the possible values of a data-type

src/json/generator.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
33
use core::iter::repeat_with;
44

5-
use rand::Rng as _;
65
use serde_json::{Map, Value};
76

87
use crate::errors::{Error, Res};
@@ -51,10 +50,9 @@ impl Generator<Value> for Vec<Value> {
5150
let array_item_type = iter.next().ok_or(Error::ArrayMissingDataType)?;
5251

5352
let len = match (iter.next(), iter.next()) {
54-
(None, _) => data.rng().random_range(1..10),
55-
(Some(Value::Number(inf)), Some(Value::Number(sup))) => data
56-
.rng()
57-
.random_range(number_to_int(inf)?..number_to_int(sup)?),
53+
(None, _) => data.random_range(1..10),
54+
(Some(Value::Number(inf)), Some(Value::Number(sup))) =>
55+
data.random_range(number_to_int(inf)?..number_to_int(sup)?),
5856
(Some(Value::Number(inf)), None) => number_to_int(inf)?,
5957
(Some(Value::Number(_)), Some(value)) | (Some(value), _) =>
6058
return Err(Error::ExpectedInteger(value.to_owned())),

0 commit comments

Comments
 (0)