@@ -6,31 +6,32 @@ use std::collections::{HashMap, HashSet};
66
77use rand:: rngs:: ThreadRng ;
88use rand:: seq:: IndexedRandom as _;
9- use rand:: { Rng as _, RngCore , rng} ;
10- use random_data:: { DataGenerator , DataType } ;
9+ use rand:: { Rng as _, rng} ;
10+ use random_data:: DataType ;
1111use serde_json:: { Number , Value } ;
1212
13+ use crate :: data_generator:: RandomDataGenerator ;
1314use crate :: errors:: { Error , Res } ;
1415///
1516/// Generate random data of the given type.
1617pub trait Generator < T > : Sized {
1718 /// Generate random data of the given type.
18- fn generate < Rng : RngCore > ( & self , data : & mut Data < Rng > ) -> Res < T > ;
19+ fn generate ( & self , data : & mut Data ) -> Res < T > ;
1920}
2021
2122/// Generate random data of the given type, but with a nullable type.
2223pub trait NullableGenerator < T > : Sized {
2324 /// Generate random data of the given type, but with a nullable type.
2425 ///
2526 /// This can sometimes returns None.
26- fn generate_nullable < Rng : RngCore > ( & self , data : & mut Data < Rng > ) -> Res < Option < T > > ;
27+ fn generate_nullable ( & self , data : & mut Data ) -> Res < Option < T > > ;
2728}
2829
2930/// Contains the list of data types and the random generator to apply
3031/// generators.
31- pub struct Data < Rng : RngCore > {
32+ pub struct Data {
3233 /// Radnom data generator
33- random_data_generator : DataGenerator < Rng > ,
34+ random_data_generator : RandomDataGenerator ,
3435 /// Pseudo-random refs
3536 ///
3637 /// This represents data that is randomly generated once, then used in
@@ -44,7 +45,7 @@ pub struct Data<Rng: RngCore> {
4445 user_defined : HashMap < String , Vec < String > > ,
4546}
4647
47- impl < Rng : RngCore > Data < Rng > {
48+ impl Data {
4849 /// Generate non-nullable data of the provided data type.
4950 fn generate ( & mut self , data_type : & str ) -> Res < OutputData > {
5051 if let Some ( parsed) = data_type. strip_suffix ( ']' )
@@ -77,9 +78,10 @@ impl<Rng: RngCore> Data<Rng> {
7778 OutputData :: Float ( self . rng . random_range ( 0.0f64 ..=f64:: MAX ) )
7879 } else {
7980 OutputData :: String (
80- DataType :: try_from ( data_type)
81- . map_err ( |( ) | Error :: InvalidDataType ( data_type. to_owned ( ) ) ) ?
82- . random ( & mut self . random_data_generator ) ,
81+ self . random_data_generator . random_value (
82+ DataType :: try_from ( data_type)
83+ . map_err ( |( ) | Error :: InvalidDataType ( data_type. to_owned ( ) ) ) ?,
84+ ) ,
8385 )
8486 } ;
8587
@@ -199,6 +201,27 @@ impl<Rng: RngCore> Data<Rng> {
199201 list
200202 }
201203
204+ /// Build the [`Data`] handler from user inputs
205+ pub fn new ( input_data : Vec < String > , seed : Option < u64 > ) -> Res < Self > {
206+ let mut user_defined = HashMap :: new ( ) ;
207+
208+ for data_type in input_data {
209+ let ( name, values) = Self :: parse_user_defined ( & data_type) ?;
210+
211+ if user_defined. insert ( name, values) . is_some ( ) {
212+ return Err ( Error :: DuplicateDataType ( data_type) ) ;
213+ }
214+ }
215+
216+ Ok ( Self {
217+ random_data_generator : RandomDataGenerator :: new ( seed) ,
218+ user_defined,
219+ rng : rng ( ) ,
220+ refs : HashMap :: new ( ) ,
221+ uniq_types : HashMap :: new ( ) ,
222+ } )
223+ }
224+
202225 /// Parse a user-defined data-type, with the format
203226 /// `Name:Value1|Value2|Value3`.
204227 fn parse_user_defined ( user_input : & str ) -> Res < ( String , Vec < String > ) > {
@@ -242,37 +265,14 @@ impl<Rng: RngCore> Data<Rng> {
242265 }
243266}
244267
245- impl Data < ThreadRng > {
246- /// Build the [`Data`] handler from user inputs
247- pub fn new ( input_data : Vec < String > , _seed : Option < u64 > ) -> Res < Self > {
248- let mut user_defined = HashMap :: new ( ) ;
249-
250- for data_type in input_data {
251- let ( name, values) = Self :: parse_user_defined ( & data_type) ?;
252-
253- if user_defined. insert ( name, values) . is_some ( ) {
254- return Err ( Error :: DuplicateDataType ( data_type) ) ;
255- }
256- }
257-
258- Ok ( Self {
259- random_data_generator : DataGenerator :: default ( ) ,
260- user_defined,
261- rng : rng ( ) ,
262- refs : HashMap :: new ( ) ,
263- uniq_types : HashMap :: new ( ) ,
264- } )
265- }
266- }
267-
268268impl Generator < OutputData > for String {
269- fn generate < Rng : RngCore > ( & self , data : & mut Data < Rng > ) -> Res < OutputData > {
269+ fn generate ( & self , data : & mut Data ) -> Res < OutputData > {
270270 data. generate ( self )
271271 }
272272}
273273
274274impl NullableGenerator < OutputData > for String {
275- fn generate_nullable < Rng : RngCore > ( & self , data : & mut Data < Rng > ) -> Res < Option < OutputData > > {
275+ fn generate_nullable ( & self , data : & mut Data ) -> Res < Option < OutputData > > {
276276 data. generate_nullable ( self )
277277 }
278278}
0 commit comments