Skip to main content

DataGenerator

Struct DataGenerator 

Source
pub struct DataGenerator { /* private fields */ }
Expand description

The main struct for generating fake JSON data.

DataGenerator takes a configuration and provides methods to generate single records or batches of fake data based on the schema.

§Example

use datafake_rs::DataGenerator;

let config = r#"{
    "schema": {
        "id": {"fake": ["uuid"]},
        "name": {"fake": ["name"]}
    }
}"#;

let generator = DataGenerator::from_json(config).unwrap();
let data = generator.generate().unwrap();

Implementations§

Source§

impl DataGenerator

Source

pub fn new(config: DataFakeConfig) -> Self

Creates a new DataGenerator from an already-parsed configuration.

Source

pub fn from_json(json_str: &str) -> Result<Self>

Creates a new DataGenerator by parsing a JSON configuration string.

§Errors

Returns an error if the JSON is invalid or the configuration fails validation.

Examples found in repository?
examples/basic.rs (line 35)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    // Basic configuration with the example from README
5    let config = r#"{
6        "metadata": {
7            "name": "User Profile Generator",
8            "version": "1.0.0",
9            "description": "Generates realistic user profile data"
10        },
11        "variables": {
12            "userId": {"fake": ["uuid"]},
13            "country": {"fake": ["country_code"]}
14        },
15        "schema": {
16            "id": {"var": "userId"},
17            "profile": {
18                "name": {"fake": ["name", "en_US"]},
19                "age": {"fake": ["u8", 18, 65]},
20                "address": {
21                    "street": {"fake": ["street_address", "en_US"]},
22                    "country": {"var": "country"}
23                },
24                "bankAccount": {
25                    "bic": {"fake": ["bic"]},
26                    "bic8": {"fake": ["bic8"]},
27                    "bic11": {"fake": ["bic11"]},
28                    "balance": {"fake": ["f32", 0, 10000.00]}
29                }
30            }
31        }
32    }"#;
33
34    // Create the generator
35    let generator = DataGenerator::from_json(config)?;
36
37    // Generate fake data
38    let fake_data = generator.generate()?;
39
40    // Print the generated data
41    println!("Generated User Profile:");
42    println!("{}", serde_json::to_string_pretty(&fake_data)?);
43
44    // Generate multiple records
45    println!("\nGenerating 3 user profiles:");
46    let batch = generator.generate_batch(3)?;
47    for (i, data) in batch.iter().enumerate() {
48        println!("\nProfile {}:", i + 1);
49        println!("{}", serde_json::to_string_pretty(data)?);
50    }
51
52    Ok(())
53}
Source

pub fn from_value(json_value: Value) -> Result<Self>

Creates a new DataGenerator from a serde_json::Value.

§Errors

Returns an error if the value cannot be converted to a valid configuration.

Examples found in repository?
examples/benchmark.rs (line 368)
5fn main() -> Result<(), DataFakeError> {
6    let config = json!({
7        "metadata": {
8            "name": "Complex Benchmark Test",
9            "description": "Complex data generation benchmark with JSONLogic and fake operators"
10        },
11        "variables": {
12            "user_id": {"fake": ["uuid"]},
13            "base_timestamp": {"fake": ["u64", 1704067200, 1735689600]},
14            "country_code": {"fake": ["country_code"]},
15            "currency": {"fake": ["currency_code"]},
16            "age": {"fake": ["u8", 18, 65]},
17            "is_premium": {"fake": ["bool"]},
18            "base_salary": {"fake": ["f64", 30000, 150000]},
19            "company_name": {"fake": ["company_name"]},
20            "random_score": {"fake": ["f64", 0, 1]}
21        },
22        "schema": {
23            "id": {"var": "user_id"},
24            "timestamp": {"var": "base_timestamp"},
25            "user": {
26                "personal": {
27                    "first_name": {"fake": ["first_name"]},
28                    "last_name": {"fake": ["last_name"]},
29                    "full_name": {
30                        "cat": [
31                            {"fake": ["first_name"]},
32                            " ",
33                            {"fake": ["last_name"]}
34                        ]
35                    },
36                    "email": {
37                        "if": [
38                            {"var": "is_premium"},
39                            {"fake": ["email"]},
40                            {"fake": ["free_email"]}
41                        ]
42                    },
43                    "phone": {"fake": ["phone_number"]},
44                    "age": {"var": "age"},
45                    "is_adult": {">=": [{"var": "age"}, 18]},
46                    "age_group": {
47                        "if": [
48                            {"<": [{"var": "age"}, 25]},
49                            "young",
50                            {"if": [
51                                {"<": [{"var": "age"}, 40]},
52                                "adult",
53                                {"if": [
54                                    {"<": [{"var": "age"}, 60]},
55                                    "middle-aged",
56                                    "senior"
57                                ]}
58                            ]}
59                        ]
60                    },
61                    "username": {
62                        "cat": [
63                            {"fake": ["word"]},
64                            "_",
65                            {"fake": ["word"]},
66                            "_",
67                            {"fake": ["u16", 100, 999]}
68                        ]
69                    },
70                    "password_hash": {"fake": ["password", 12, 16]},
71                    "bio": {"fake": ["paragraph", 2, 4]}
72                },
73                "address": {
74                    "street": {"fake": ["street_name"]},
75                    "building": {"fake": ["u16", 1, 999]},
76                    "full_address": {
77                        "cat": [
78                            {"fake": ["u16", 1, 999]},
79                            " ",
80                            {"fake": ["street_name"]},
81                            " ",
82                            {"fake": ["street_suffix"]}
83                        ]
84                    },
85                    "city": {"fake": ["city"]},
86                    "state": {"fake": ["state_name"]},
87                    "country": {"var": "country_code"},
88                    "postal_code": {"fake": ["post_code"]},
89                    "coordinates": {
90                        "lat": {"fake": ["latitude"]},
91                        "lng": {"fake": ["longitude"]},
92                        "formatted": {
93                            "cat": [
94                                {"fake": ["latitude"]},
95                                ", ",
96                                {"fake": ["longitude"]}
97                            ]
98                        }
99                    }
100                },
101                "professional": {
102                    "company": {"var": "company_name"},
103                    "job_title": {"fake": ["profession"]},
104                    "department": {"fake": ["industry"]},
105                    "years_experience": {
106                        "max": [
107                            0,
108                            {"-": [
109                                {"var": "age"},
110                                18
111                            ]}
112                        ]
113                    },
114                    "email": {
115                        "cat": [
116                            {"fake": ["word"]},
117                            ".",
118                            {"fake": ["word"]},
119                            "@",
120                            {"fake": ["word"]},
121                            ".com"
122                        ]
123                    },
124                    "company_suffix": {"fake": ["company_suffix"]},
125                    "catch_phrase": {"fake": ["catch_phrase"]}
126                },
127                "financial": {
128                    "currency": {"var": "currency"},
129                    "credit_card": {"fake": ["credit_card_number"]},
130                    "bank_account": {"fake": ["bic"]},
131                    "base_salary": {"var": "base_salary"},
132                    "bonus_percentage": {
133                        "if": [
134                            {"var": "is_premium"},
135                            {"fake": ["f64", 15, 30]},
136                            {"fake": ["f64", 5, 15]}
137                        ]
138                    },
139                    "total_compensation": {
140                        "*": [
141                            {"var": "base_salary"},
142                            {"+": [
143                                1,
144                                {"/": [
145                                    {"if": [
146                                        {"var": "is_premium"},
147                                        0.225,
148                                        0.1
149                                    ]},
150                                    1
151                                ]}
152                            ]}
153                        ]
154                    },
155                    "credit_score": {
156                        "if": [
157                            {"var": "is_premium"},
158                            {"fake": ["u16", 700, 850]},
159                            {"fake": ["u16", 500, 700]}
160                        ]
161                    },
162                    "has_debt": {"<": [{"var": "random_score"}, 0.6]},
163                    "debt_amount": {
164                        "if": [
165                            {"<": [{"var": "random_score"}, 0.6]},
166                            {"fake": ["f64", 1000, 50000]},
167                            0
168                        ]
169                    }
170                },
171                "internet": {
172                    "ip_v4": {"fake": ["ipv4"]},
173                    "ip_v6": {"fake": ["ipv6"]},
174                    "mac_address": {"fake": ["mac_address"]},
175                    "user_agent": {"fake": ["user_agent"]},
176                    "domain": {
177                        "cat": [
178                            {"fake": ["word"]},
179                            ".",
180                            {"fake": ["domain_suffix"]}
181                        ]
182                    },
183                    "bandwidth_mbps": {
184                        "if": [
185                            {"var": "is_premium"},
186                            {"fake": ["u16", 100, 1000]},
187                            {"fake": ["u16", 10, 100]}
188                        ]
189                    }
190                },
191                "preferences": {
192                    "theme": {
193                        "if": [
194                            {"<": [{"var": "random_score"}, 0.7]},
195                            "dark",
196                            "light"
197                        ]
198                    },
199                    "language": {
200                        "if": [
201                            {"==": [{"var": "country_code"}, "US"]},
202                            "en-US",
203                            {"if": [
204                                {"==": [{"var": "country_code"}, "GB"]},
205                                "en-GB",
206                                {"if": [
207                                    {"==": [{"var": "country_code"}, "FR"]},
208                                    "fr-FR",
209                                    "en-US"
210                                ]}
211                            ]}
212                        ]
213                    },
214                    "notifications": {
215                        "email": {"var": "is_premium"},
216                        "push": {"<": [{"var": "random_score"}, 0.8]},
217                        "sms": {"and": [
218                            {"var": "is_premium"},
219                            {"<": [{"var": "random_score"}, 0.5]}
220                        ]}
221                    },
222                    "privacy_level": {
223                        "if": [
224                            {"var": "is_premium"},
225                            {"if": [
226                                {"<": [{"var": "random_score"}, 0.7]},
227                                "high",
228                                "medium"
229                            ]},
230                            {"if": [
231                                {"<": [{"var": "random_score"}, 0.3]},
232                                "high",
233                                {"if": [
234                                    {"<": [{"var": "random_score"}, 0.7]},
235                                    "medium",
236                                    "low"
237                                ]}
238                            ]}
239                        ]
240                    }
241                },
242                "metadata": {
243                    "account_created": {"fake": ["u64", 1577836800, 1704067200]},
244                    "last_login": {"fake": ["u64", 1735689600, 1738368000]},
245                    "login_count": {
246                        "*": [
247                            {"fake": ["u16", 10, 365]},
248                            {"-": [
249                                2024,
250                                {"+": [
251                                    2020,
252                                    {"fake": ["u8", 0, 3]}
253                                ]}
254                            ]}
255                        ]
256                    },
257                    "is_verified": {"or": [
258                        {"var": "is_premium"},
259                        {"<": [{"var": "random_score"}, 0.7]}
260                    ]},
261                    "subscription_tier": {
262                        "if": [
263                            {"var": "is_premium"},
264                            {"if": [
265                                {"<": [{"var": "random_score"}, 0.5]},
266                                "pro",
267                                "enterprise"
268                            ]},
269                            "free"
270                        ]
271                    },
272                    "risk_score": {
273                        "max": [
274                            0,
275                            {"min": [
276                                100,
277                                {"+": [
278                                    {"if": [{"var": "is_verified"}, 0, 20]},
279                                    {"if": [{"var": "is_premium"}, 0, 15]},
280                                    {"*": [
281                                        {"var": "random_score"},
282                                        65
283                                    ]}
284                                ]}
285                            ]}
286                        ]
287                    }
288                }
289            },
290            "activity": {
291                "recent_transactions": [
292                    {
293                        "id": {"fake": ["uuid"]},
294                        "amount": {
295                            "*": [
296                                {"fake": ["f64", 10, 500]},
297                                {"if": [{"var": "is_premium"}, 1.5, 1]}
298                            ]
299                        },
300                        "merchant": {"fake": ["company_name"]},
301                        "category": {"fake": ["industry"]},
302                        "timestamp": {"fake": ["u64", 1735000000, 1738000000]},
303                        "approved": {"or": [
304                            {"var": "is_premium"},
305                            {">": [{"var": "random_score"}, 0.1]}
306                        ]}
307                    },
308                    {
309                        "id": {"fake": ["uuid"]},
310                        "amount": {
311                            "*": [
312                                {"fake": ["f64", 10, 500]},
313                                {"if": [{"var": "is_premium"}, 1.5, 1]}
314                            ]
315                        },
316                        "merchant": {"fake": ["company_name"]},
317                        "category": {"fake": ["industry"]},
318                        "timestamp": {"fake": ["u64", 1735000000, 1738000000]},
319                        "approved": {"or": [
320                            {"var": "is_premium"},
321                            {">": [{"var": "random_score"}, 0.1]}
322                        ]}
323                    },
324                    {
325                        "id": {"fake": ["uuid"]},
326                        "amount": {
327                            "*": [
328                                {"fake": ["f64", 10, 500]},
329                                {"if": [{"var": "is_premium"}, 1.5, 1]}
330                            ]
331                        },
332                        "merchant": {"fake": ["company_name"]},
333                        "category": {"fake": ["industry"]},
334                        "timestamp": {"fake": ["u64", 1735000000, 1738000000]},
335                        "approved": {"or": [
336                            {"var": "is_premium"},
337                            {">": [{"var": "random_score"}, 0.1]}
338                        ]}
339                    }
340                ],
341                "engagement_score": {
342                    "*": [
343                        100,
344                        {"min": [
345                            1,
346                            {"max": [
347                                0,
348                                {"+": [
349                                    {"if": [{"var": "is_premium"}, 0.3, 0]},
350                                    {"if": [{"var": "is_verified"}, 0.2, 0]},
351                                    {"*": [{"var": "random_score"}, 0.5]}
352                                ]}
353                            ]}
354                        ]}
355                    ]
356                },
357                "features_used": {
358                    "if": [
359                        {"var": "is_premium"},
360                        ["dashboard", "profile", "settings", "analytics", "api", "export", "import"],
361                        ["dashboard", "profile", "settings"]
362                    ]
363                }
364            }
365        }
366    });
367
368    let generator = DataGenerator::from_value(config)?;
369
370    println!("Starting benchmark: generating complex data 100,000 times...");
371    println!("This benchmark uses a mix of:");
372    println!("- Fake data operators");
373    println!("- JSONLogic expressions (if/then/else, arithmetic, string operations)");
374    println!("- Variable references");
375    println!("- Complex nested structures");
376    println!();
377
378    let iterations = 100_000;
379    let mut last_progress = 0;
380
381    let start = Instant::now();
382
383    for i in 0..iterations {
384        let _ = generator.generate()?;
385
386        let progress = (i * 100) / iterations;
387        if progress > last_progress && progress % 10 == 0 {
388            println!("Progress: {progress}%");
389            last_progress = progress;
390        }
391    }
392
393    let duration = start.elapsed();
394
395    println!("\n=== Benchmark Results ===");
396    println!("Total iterations: {iterations}");
397    println!("Total time: {duration:.2?}");
398    println!(
399        "Average time per generation: {:.2?}",
400        duration / iterations as u32
401    );
402    println!(
403        "Generations per second: {:.2}",
404        iterations as f64 / duration.as_secs_f64()
405    );
406
407    let sample = generator.generate()?;
408    println!(
409        "\nSample output size: {} bytes",
410        serde_json::to_string(&sample)?.len()
411    );
412    println!("\nSample output (pretty printed):");
413    println!("{}", serde_json::to_string_pretty(&sample)?);
414
415    Ok(())
416}
Source

pub fn generate(&self) -> Result<Value>

Generates a single fake data record based on the schema.

Each call generates fresh random data. Variables are evaluated once per call and can be referenced multiple times within the schema.

§Errors

Returns an error if data generation fails (e.g., invalid operator usage).

Examples found in repository?
examples/basic.rs (line 38)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    // Basic configuration with the example from README
5    let config = r#"{
6        "metadata": {
7            "name": "User Profile Generator",
8            "version": "1.0.0",
9            "description": "Generates realistic user profile data"
10        },
11        "variables": {
12            "userId": {"fake": ["uuid"]},
13            "country": {"fake": ["country_code"]}
14        },
15        "schema": {
16            "id": {"var": "userId"},
17            "profile": {
18                "name": {"fake": ["name", "en_US"]},
19                "age": {"fake": ["u8", 18, 65]},
20                "address": {
21                    "street": {"fake": ["street_address", "en_US"]},
22                    "country": {"var": "country"}
23                },
24                "bankAccount": {
25                    "bic": {"fake": ["bic"]},
26                    "bic8": {"fake": ["bic8"]},
27                    "bic11": {"fake": ["bic11"]},
28                    "balance": {"fake": ["f32", 0, 10000.00]}
29                }
30            }
31        }
32    }"#;
33
34    // Create the generator
35    let generator = DataGenerator::from_json(config)?;
36
37    // Generate fake data
38    let fake_data = generator.generate()?;
39
40    // Print the generated data
41    println!("Generated User Profile:");
42    println!("{}", serde_json::to_string_pretty(&fake_data)?);
43
44    // Generate multiple records
45    println!("\nGenerating 3 user profiles:");
46    let batch = generator.generate_batch(3)?;
47    for (i, data) in batch.iter().enumerate() {
48        println!("\nProfile {}:", i + 1);
49        println!("{}", serde_json::to_string_pretty(data)?);
50    }
51
52    Ok(())
53}
More examples
Hide additional examples
examples/benchmark.rs (line 384)
5fn main() -> Result<(), DataFakeError> {
6    let config = json!({
7        "metadata": {
8            "name": "Complex Benchmark Test",
9            "description": "Complex data generation benchmark with JSONLogic and fake operators"
10        },
11        "variables": {
12            "user_id": {"fake": ["uuid"]},
13            "base_timestamp": {"fake": ["u64", 1704067200, 1735689600]},
14            "country_code": {"fake": ["country_code"]},
15            "currency": {"fake": ["currency_code"]},
16            "age": {"fake": ["u8", 18, 65]},
17            "is_premium": {"fake": ["bool"]},
18            "base_salary": {"fake": ["f64", 30000, 150000]},
19            "company_name": {"fake": ["company_name"]},
20            "random_score": {"fake": ["f64", 0, 1]}
21        },
22        "schema": {
23            "id": {"var": "user_id"},
24            "timestamp": {"var": "base_timestamp"},
25            "user": {
26                "personal": {
27                    "first_name": {"fake": ["first_name"]},
28                    "last_name": {"fake": ["last_name"]},
29                    "full_name": {
30                        "cat": [
31                            {"fake": ["first_name"]},
32                            " ",
33                            {"fake": ["last_name"]}
34                        ]
35                    },
36                    "email": {
37                        "if": [
38                            {"var": "is_premium"},
39                            {"fake": ["email"]},
40                            {"fake": ["free_email"]}
41                        ]
42                    },
43                    "phone": {"fake": ["phone_number"]},
44                    "age": {"var": "age"},
45                    "is_adult": {">=": [{"var": "age"}, 18]},
46                    "age_group": {
47                        "if": [
48                            {"<": [{"var": "age"}, 25]},
49                            "young",
50                            {"if": [
51                                {"<": [{"var": "age"}, 40]},
52                                "adult",
53                                {"if": [
54                                    {"<": [{"var": "age"}, 60]},
55                                    "middle-aged",
56                                    "senior"
57                                ]}
58                            ]}
59                        ]
60                    },
61                    "username": {
62                        "cat": [
63                            {"fake": ["word"]},
64                            "_",
65                            {"fake": ["word"]},
66                            "_",
67                            {"fake": ["u16", 100, 999]}
68                        ]
69                    },
70                    "password_hash": {"fake": ["password", 12, 16]},
71                    "bio": {"fake": ["paragraph", 2, 4]}
72                },
73                "address": {
74                    "street": {"fake": ["street_name"]},
75                    "building": {"fake": ["u16", 1, 999]},
76                    "full_address": {
77                        "cat": [
78                            {"fake": ["u16", 1, 999]},
79                            " ",
80                            {"fake": ["street_name"]},
81                            " ",
82                            {"fake": ["street_suffix"]}
83                        ]
84                    },
85                    "city": {"fake": ["city"]},
86                    "state": {"fake": ["state_name"]},
87                    "country": {"var": "country_code"},
88                    "postal_code": {"fake": ["post_code"]},
89                    "coordinates": {
90                        "lat": {"fake": ["latitude"]},
91                        "lng": {"fake": ["longitude"]},
92                        "formatted": {
93                            "cat": [
94                                {"fake": ["latitude"]},
95                                ", ",
96                                {"fake": ["longitude"]}
97                            ]
98                        }
99                    }
100                },
101                "professional": {
102                    "company": {"var": "company_name"},
103                    "job_title": {"fake": ["profession"]},
104                    "department": {"fake": ["industry"]},
105                    "years_experience": {
106                        "max": [
107                            0,
108                            {"-": [
109                                {"var": "age"},
110                                18
111                            ]}
112                        ]
113                    },
114                    "email": {
115                        "cat": [
116                            {"fake": ["word"]},
117                            ".",
118                            {"fake": ["word"]},
119                            "@",
120                            {"fake": ["word"]},
121                            ".com"
122                        ]
123                    },
124                    "company_suffix": {"fake": ["company_suffix"]},
125                    "catch_phrase": {"fake": ["catch_phrase"]}
126                },
127                "financial": {
128                    "currency": {"var": "currency"},
129                    "credit_card": {"fake": ["credit_card_number"]},
130                    "bank_account": {"fake": ["bic"]},
131                    "base_salary": {"var": "base_salary"},
132                    "bonus_percentage": {
133                        "if": [
134                            {"var": "is_premium"},
135                            {"fake": ["f64", 15, 30]},
136                            {"fake": ["f64", 5, 15]}
137                        ]
138                    },
139                    "total_compensation": {
140                        "*": [
141                            {"var": "base_salary"},
142                            {"+": [
143                                1,
144                                {"/": [
145                                    {"if": [
146                                        {"var": "is_premium"},
147                                        0.225,
148                                        0.1
149                                    ]},
150                                    1
151                                ]}
152                            ]}
153                        ]
154                    },
155                    "credit_score": {
156                        "if": [
157                            {"var": "is_premium"},
158                            {"fake": ["u16", 700, 850]},
159                            {"fake": ["u16", 500, 700]}
160                        ]
161                    },
162                    "has_debt": {"<": [{"var": "random_score"}, 0.6]},
163                    "debt_amount": {
164                        "if": [
165                            {"<": [{"var": "random_score"}, 0.6]},
166                            {"fake": ["f64", 1000, 50000]},
167                            0
168                        ]
169                    }
170                },
171                "internet": {
172                    "ip_v4": {"fake": ["ipv4"]},
173                    "ip_v6": {"fake": ["ipv6"]},
174                    "mac_address": {"fake": ["mac_address"]},
175                    "user_agent": {"fake": ["user_agent"]},
176                    "domain": {
177                        "cat": [
178                            {"fake": ["word"]},
179                            ".",
180                            {"fake": ["domain_suffix"]}
181                        ]
182                    },
183                    "bandwidth_mbps": {
184                        "if": [
185                            {"var": "is_premium"},
186                            {"fake": ["u16", 100, 1000]},
187                            {"fake": ["u16", 10, 100]}
188                        ]
189                    }
190                },
191                "preferences": {
192                    "theme": {
193                        "if": [
194                            {"<": [{"var": "random_score"}, 0.7]},
195                            "dark",
196                            "light"
197                        ]
198                    },
199                    "language": {
200                        "if": [
201                            {"==": [{"var": "country_code"}, "US"]},
202                            "en-US",
203                            {"if": [
204                                {"==": [{"var": "country_code"}, "GB"]},
205                                "en-GB",
206                                {"if": [
207                                    {"==": [{"var": "country_code"}, "FR"]},
208                                    "fr-FR",
209                                    "en-US"
210                                ]}
211                            ]}
212                        ]
213                    },
214                    "notifications": {
215                        "email": {"var": "is_premium"},
216                        "push": {"<": [{"var": "random_score"}, 0.8]},
217                        "sms": {"and": [
218                            {"var": "is_premium"},
219                            {"<": [{"var": "random_score"}, 0.5]}
220                        ]}
221                    },
222                    "privacy_level": {
223                        "if": [
224                            {"var": "is_premium"},
225                            {"if": [
226                                {"<": [{"var": "random_score"}, 0.7]},
227                                "high",
228                                "medium"
229                            ]},
230                            {"if": [
231                                {"<": [{"var": "random_score"}, 0.3]},
232                                "high",
233                                {"if": [
234                                    {"<": [{"var": "random_score"}, 0.7]},
235                                    "medium",
236                                    "low"
237                                ]}
238                            ]}
239                        ]
240                    }
241                },
242                "metadata": {
243                    "account_created": {"fake": ["u64", 1577836800, 1704067200]},
244                    "last_login": {"fake": ["u64", 1735689600, 1738368000]},
245                    "login_count": {
246                        "*": [
247                            {"fake": ["u16", 10, 365]},
248                            {"-": [
249                                2024,
250                                {"+": [
251                                    2020,
252                                    {"fake": ["u8", 0, 3]}
253                                ]}
254                            ]}
255                        ]
256                    },
257                    "is_verified": {"or": [
258                        {"var": "is_premium"},
259                        {"<": [{"var": "random_score"}, 0.7]}
260                    ]},
261                    "subscription_tier": {
262                        "if": [
263                            {"var": "is_premium"},
264                            {"if": [
265                                {"<": [{"var": "random_score"}, 0.5]},
266                                "pro",
267                                "enterprise"
268                            ]},
269                            "free"
270                        ]
271                    },
272                    "risk_score": {
273                        "max": [
274                            0,
275                            {"min": [
276                                100,
277                                {"+": [
278                                    {"if": [{"var": "is_verified"}, 0, 20]},
279                                    {"if": [{"var": "is_premium"}, 0, 15]},
280                                    {"*": [
281                                        {"var": "random_score"},
282                                        65
283                                    ]}
284                                ]}
285                            ]}
286                        ]
287                    }
288                }
289            },
290            "activity": {
291                "recent_transactions": [
292                    {
293                        "id": {"fake": ["uuid"]},
294                        "amount": {
295                            "*": [
296                                {"fake": ["f64", 10, 500]},
297                                {"if": [{"var": "is_premium"}, 1.5, 1]}
298                            ]
299                        },
300                        "merchant": {"fake": ["company_name"]},
301                        "category": {"fake": ["industry"]},
302                        "timestamp": {"fake": ["u64", 1735000000, 1738000000]},
303                        "approved": {"or": [
304                            {"var": "is_premium"},
305                            {">": [{"var": "random_score"}, 0.1]}
306                        ]}
307                    },
308                    {
309                        "id": {"fake": ["uuid"]},
310                        "amount": {
311                            "*": [
312                                {"fake": ["f64", 10, 500]},
313                                {"if": [{"var": "is_premium"}, 1.5, 1]}
314                            ]
315                        },
316                        "merchant": {"fake": ["company_name"]},
317                        "category": {"fake": ["industry"]},
318                        "timestamp": {"fake": ["u64", 1735000000, 1738000000]},
319                        "approved": {"or": [
320                            {"var": "is_premium"},
321                            {">": [{"var": "random_score"}, 0.1]}
322                        ]}
323                    },
324                    {
325                        "id": {"fake": ["uuid"]},
326                        "amount": {
327                            "*": [
328                                {"fake": ["f64", 10, 500]},
329                                {"if": [{"var": "is_premium"}, 1.5, 1]}
330                            ]
331                        },
332                        "merchant": {"fake": ["company_name"]},
333                        "category": {"fake": ["industry"]},
334                        "timestamp": {"fake": ["u64", 1735000000, 1738000000]},
335                        "approved": {"or": [
336                            {"var": "is_premium"},
337                            {">": [{"var": "random_score"}, 0.1]}
338                        ]}
339                    }
340                ],
341                "engagement_score": {
342                    "*": [
343                        100,
344                        {"min": [
345                            1,
346                            {"max": [
347                                0,
348                                {"+": [
349                                    {"if": [{"var": "is_premium"}, 0.3, 0]},
350                                    {"if": [{"var": "is_verified"}, 0.2, 0]},
351                                    {"*": [{"var": "random_score"}, 0.5]}
352                                ]}
353                            ]}
354                        ]}
355                    ]
356                },
357                "features_used": {
358                    "if": [
359                        {"var": "is_premium"},
360                        ["dashboard", "profile", "settings", "analytics", "api", "export", "import"],
361                        ["dashboard", "profile", "settings"]
362                    ]
363                }
364            }
365        }
366    });
367
368    let generator = DataGenerator::from_value(config)?;
369
370    println!("Starting benchmark: generating complex data 100,000 times...");
371    println!("This benchmark uses a mix of:");
372    println!("- Fake data operators");
373    println!("- JSONLogic expressions (if/then/else, arithmetic, string operations)");
374    println!("- Variable references");
375    println!("- Complex nested structures");
376    println!();
377
378    let iterations = 100_000;
379    let mut last_progress = 0;
380
381    let start = Instant::now();
382
383    for i in 0..iterations {
384        let _ = generator.generate()?;
385
386        let progress = (i * 100) / iterations;
387        if progress > last_progress && progress % 10 == 0 {
388            println!("Progress: {progress}%");
389            last_progress = progress;
390        }
391    }
392
393    let duration = start.elapsed();
394
395    println!("\n=== Benchmark Results ===");
396    println!("Total iterations: {iterations}");
397    println!("Total time: {duration:.2?}");
398    println!(
399        "Average time per generation: {:.2?}",
400        duration / iterations as u32
401    );
402    println!(
403        "Generations per second: {:.2}",
404        iterations as f64 / duration.as_secs_f64()
405    );
406
407    let sample = generator.generate()?;
408    println!(
409        "\nSample output size: {} bytes",
410        serde_json::to_string(&sample)?.len()
411    );
412    println!("\nSample output (pretty printed):");
413    println!("{}", serde_json::to_string_pretty(&sample)?);
414
415    Ok(())
416}
Source

pub fn generate_batch(&self, count: usize) -> Result<Vec<Value>>

Generates multiple fake data records.

Each record is independently generated with fresh random data.

§Arguments
  • count - The number of records to generate.
§Errors

Returns an error if any record generation fails.

Examples found in repository?
examples/basic.rs (line 46)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    // Basic configuration with the example from README
5    let config = r#"{
6        "metadata": {
7            "name": "User Profile Generator",
8            "version": "1.0.0",
9            "description": "Generates realistic user profile data"
10        },
11        "variables": {
12            "userId": {"fake": ["uuid"]},
13            "country": {"fake": ["country_code"]}
14        },
15        "schema": {
16            "id": {"var": "userId"},
17            "profile": {
18                "name": {"fake": ["name", "en_US"]},
19                "age": {"fake": ["u8", 18, 65]},
20                "address": {
21                    "street": {"fake": ["street_address", "en_US"]},
22                    "country": {"var": "country"}
23                },
24                "bankAccount": {
25                    "bic": {"fake": ["bic"]},
26                    "bic8": {"fake": ["bic8"]},
27                    "bic11": {"fake": ["bic11"]},
28                    "balance": {"fake": ["f32", 0, 10000.00]}
29                }
30            }
31        }
32    }"#;
33
34    // Create the generator
35    let generator = DataGenerator::from_json(config)?;
36
37    // Generate fake data
38    let fake_data = generator.generate()?;
39
40    // Print the generated data
41    println!("Generated User Profile:");
42    println!("{}", serde_json::to_string_pretty(&fake_data)?);
43
44    // Generate multiple records
45    println!("\nGenerating 3 user profiles:");
46    let batch = generator.generate_batch(3)?;
47    for (i, data) in batch.iter().enumerate() {
48        println!("\nProfile {}:", i + 1);
49        println!("{}", serde_json::to_string_pretty(data)?);
50    }
51
52    Ok(())
53}
Source

pub fn config(&self) -> &DataFakeConfig

Returns a reference to the underlying configuration.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Fake for T

Source§

fn fake<U>(&self) -> U
where Self: FakeBase<U>,

Source§

fn fake_with_rng<U, R>(&self, rng: &mut R) -> U
where R: Rng + ?Sized, Self: FakeBase<U>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V