dataforge/generation/
custom.rs1use serde_json::Value;
4use super::Generator;
5
6pub struct ChineseAddressGenerator;
8
9impl Generator for ChineseAddressGenerator {
10 fn generate(&self) -> Value {
11 use crate::regions::china::{province, rand_chinese};
12 use rand::Rng;
13
14 let mut rng = rand::thread_rng();
15 let province_val = province();
16 let city = format!("{}市", rand_chinese(2..4));
17 let district = format!("{}区", rand_chinese(2..3));
18 let street = format!("{}街{}号", rand_chinese(2..4), rng.gen_range(1..999));
19
20 Value::String(format!(
21 "{}{}{}{}",
22 province_val.as_str().unwrap_or("北京市"),
23 city,
24 district,
25 street
26 ))
27 }
28}
29
30pub struct ProductGenerator;
32
33impl Generator for ProductGenerator {
34 fn generate(&self) -> Value {
35 use rand::seq::SliceRandom;
36 use rand::Rng;
37
38 let categories = ["电子产品", "服装", "食品", "图书", "家居"];
39 let adjectives = ["高品质", "经典", "时尚", "实用", "创新"];
40 let nouns = ["产品", "商品", "物品", "用品"];
41
42 let mut rng = rand::thread_rng();
43 let category = categories.choose(&mut rng).unwrap();
44 let adjective = adjectives.choose(&mut rng).unwrap();
45 let noun = nouns.choose(&mut rng).unwrap();
46 let id = rng.gen_range(10000..99999);
47
48 serde_json::json!({
49 "id": id,
50 "name": format!("{}{}{}", adjective, category, noun),
51 "category": category,
52 "price": rng.gen_range(10.0..1000.0),
53 "in_stock": rng.gen_bool(0.8)
54 })
55 }
56}
57
58pub struct CustomGeneratorFactory;
60
61impl CustomGeneratorFactory {
62 pub fn chinese_address() -> Box<dyn Generator> {
64 Box::new(ChineseAddressGenerator)
65 }
66
67 pub fn product() -> Box<dyn Generator> {
69 Box::new(ProductGenerator)
70 }
71
72 pub fn range_number(min: i32, max: i32) -> Box<dyn Generator> {
74 struct RangeNumberGenerator {
75 min: i32,
76 max: i32,
77 }
78
79 impl Generator for RangeNumberGenerator {
80 fn generate(&self) -> Value {
81 use rand::Rng;
82 let mut rng = rand::thread_rng();
83 Value::Number(rng.gen_range(self.min..=self.max).into())
84 }
85 }
86
87 Box::new(RangeNumberGenerator { min, max })
88 }
89
90 pub fn choice<T: Clone + Into<Value> + Send + Sync + 'static>(options: Vec<T>) -> Box<dyn Generator> {
92 struct ChoiceGenerator<T> {
93 options: Vec<T>,
94 }
95
96 impl<T: Clone + Into<Value> + Send + Sync> Generator for ChoiceGenerator<T> {
97 fn generate(&self) -> Value {
98 use rand::seq::SliceRandom;
99 let mut rng = rand::thread_rng();
100 self.options.choose(&mut rng)
101 .map(|item| item.clone().into())
102 .unwrap_or(Value::Null)
103 }
104 }
105
106 Box::new(ChoiceGenerator { options })
107 }
108}