1pub mod generators;
28pub mod regions;
29pub mod macros;
30pub mod error;
31pub mod core;
32pub mod memory;
33pub mod rules;
34pub mod config;
35pub mod multithreading;
36pub mod customization;
37pub mod filling;
38pub mod generation;
39
40pub mod db;
42
43pub use generators::*;
45pub use regions::*;
46pub use error::*;
47pub use core::{CoreEngine, GenConfig, GenerationStrategy, GeneratorMetrics};
48pub use db::{DataType, DatabaseForge, FieldSchema, SchemaParser, SimpleDatabaseForge, TableSchema};
49pub use memory::{MemoryPool, MemoryPoolConfig, StringPool};
50pub use rules::{Rule, RuleContext, RuleEngine, RuleType};
51pub use config::{Config, ConfigManager, DataGenConfig, DatabaseConfig};
52pub use multithreading::{ParallelGenerator, ThreadPool};
53pub use filling::{ConnectionConfig, ConnectionManager, DatabaseFiller, FillingConfig, FillingStats};
54pub use filling::utils;
55
56#[cfg(feature = "database")]
58pub use db::{MySqlForge, PostgresForge, SqliteForge};
59
60#[derive(Default)]
62pub struct DataForge {
63 generators: std::collections::HashMap<&'static str, Box<dyn Fn() -> serde_json::Value + Send + Sync>>,
64 #[allow(dead_code)]
65 lang: Language,
66}
67
68#[derive(Debug, Clone, Copy, Default)]
70pub enum Language {
71 #[default]
72 ZhCN,
73 EnUS,
74 JaJP,
75}
76
77impl DataForge {
78 pub fn new(lang: Language) -> Self {
80 let mut df = Self {
81 generators: std::collections::HashMap::new(),
82 lang,
83 };
84 df.register_builtin_generators();
85 df
86 }
87
88 fn register_builtin_generators(&mut self) {
90 self.generators.insert("uuid_v4", Box::new(|| {
91 serde_json::Value::String(uuid::Uuid::new_v4().to_string())
92 }));
93
94 self.generators.insert("zh_cn_name", Box::new(|| {
95 serde_json::Value::String(generators::name::zh_cn_fullname())
96 }));
97
98 self.generators.insert("en_us_name", Box::new(|| {
99 serde_json::Value::String(generators::name::en_us_fullname())
100 }));
101 }
102
103 pub fn generate(&self, generator_type: &str) -> Option<serde_json::Value> {
105 self.generators.get(generator_type).map(|gen| gen())
106 }
107
108 pub fn register<F>(&mut self, name: &'static str, generator: F)
110 where
111 F: Fn() -> serde_json::Value + Send + Sync + 'static,
112 {
113 self.generators.insert(name, Box::new(generator));
114 }
115}
116
117#[cfg(test)]
118mod tests {
119 use super::*;
120
121 #[test]
122 fn test_dataforge_creation() {
123 let forge = DataForge::new(Language::ZhCN);
124 assert!(forge.generate("uuid_v4").is_some());
125 }
126
127 #[test]
128 fn test_custom_generator() {
129 let mut forge = DataForge::new(Language::ZhCN);
130 forge.register("test_gen", || serde_json::Value::String("test".to_string()));
131
132 let result = forge.generate("test_gen");
133 assert_eq!(result, Some(serde_json::Value::String("test".to_string())));
134 }
135}