dataforge/generation/
custom.rs

1//! 自定义生成器实现
2
3use serde_json::Value;
4use super::Generator;
5
6/// 自定义生成器示例 - 中文地址生成器
7pub 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
30/// 自定义生成器示例 - 产品信息生成器
31pub 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
58/// 自定义生成器工厂
59pub struct CustomGeneratorFactory;
60
61impl CustomGeneratorFactory {
62    /// 创建中文地址生成器
63    pub fn chinese_address() -> Box<dyn Generator> {
64        Box::new(ChineseAddressGenerator)
65    }
66    
67    /// 创建产品生成器
68    pub fn product() -> Box<dyn Generator> {
69        Box::new(ProductGenerator)
70    }
71    
72    /// 创建范围数字生成器
73    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    /// 创建选择生成器
91    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}