1use std::collections::HashMap;
5use librarys::random_letters;
6use serde_json::Value;
7use crate::error::Result;
8use crate::generation::DataForge;
10use crate::db::schema::{TableSchema, FieldSchema, DataType, FieldGeneratorType};
11use crate::generators::{number, datetime, internet};
13
14
15pub struct GenericDataGenerator;
17
18impl GenericDataGenerator {
19 pub fn generate_data_by_schema(schema: &TableSchema, count: usize) -> Result<Vec<HashMap<String, Value>>> {
21 let mut data = Vec::with_capacity(count);
22 let forge = DataForge::new(crate::generation::Language::ZhCN);
24
25 for _ in 1..=count {
26 let mut row = HashMap::new();
27
28 for field in &schema.fields {
29 let value = Self::generate_value_for_field(&forge, field)?;
30 row.insert(field.name.clone(), value);
31 }
32
33 data.push(row);
34 }
35
36 Ok(data)
37 }
38
39 fn generate_value_for_field(forge: &DataForge, field: &FieldSchema) -> Result<Value> {
41 if let Some(generator_type) = &field.generator_type {
43 return Self::generate_value_by_generator_type(forge, field, generator_type);
44 }
45
46 match &field.data_type {
48 DataType::String { max_length } => {
49 let max_len = max_length.unwrap_or(255) as usize;
50 let len = std::cmp::min(10, max_len);
51 Ok(Value::String(random_letters(len)))
53 },
54 DataType::Integer { .. } => {
55 Ok(forge.generate("random_int").unwrap_or_else(|| {
57 Value::Number(serde_json::Number::from(crate::generators::random_int(0, 1000000)))
58 }))
59 },
60 DataType::Float { .. } => {
61 Ok(forge.generate("random_float").unwrap_or_else(|| {
63 Value::Number(serde_json::Number::from_f64(crate::generators::random_float(0.0, 1000.0)).unwrap())
64 }))
65 },
66 DataType::Boolean => {
67 Ok(forge.generate("random_bool").unwrap_or_else(|| {
69 Value::Bool(crate::generators::random_bool())
70 }))
71 },
72 DataType::DateTime { .. } => {
73 Ok(forge.generate("datetime_now").unwrap_or_else(|| {
75 Value::String(crate::generators::datetime::iso8601())
76 }))
77 },
78 DataType::Date { .. } => {
79 Ok(forge.generate("date_now").unwrap_or_else(|| {
81 Value::String(crate::generators::datetime::date_iso())
82 }))
83 },
84 DataType::Email => {
85 Ok(forge.generate("email").unwrap_or_else(|| {
87 Value::String(crate::generators::internet::email())
88 }))
89 },
90 DataType::Phone { .. } => {
91 Ok(forge.generate("phone_cn").unwrap_or_else(|| {
93 Value::String(crate::generators::number::phone_number_cn())
94 }))
95 },
96 DataType::Url => {
97 Ok(forge.generate("url").unwrap_or_else(|| {
99 Value::String(crate::generators::internet::url())
100 }))
101 },
102 DataType::Uuid => {
103 Ok(forge.generate("uuid_v4").unwrap_or_else(|| {
105 Value::String(crate::generators::uuid_v4())
106 }))
107 },
108 _ => {
109 Ok(Value::String(random_letters(10)))
111 }
112 }
113 }
114
115 fn generate_value_by_generator_type(forge: &DataForge, field: &FieldSchema, generator_type: &FieldGeneratorType) -> Result<Value> {
117 match generator_type {
118 FieldGeneratorType::Default => {
119 Self::generate_value_for_field(forge, field)
121 },
122 FieldGeneratorType::Custom(generator_name) => {
123 Ok(forge.generate(generator_name).unwrap_or_else(|| {
125 Value::String(format!("custom_{}", generator_name))
126 }))
127 },
128 FieldGeneratorType::RandomString => {
129 let len = match &field.data_type {
130 DataType::String { max_length } => max_length.unwrap_or(10),
131 _ => 10,
132 };
133 Ok(Value::String(random_letters(len as usize)))
134 },
135 FieldGeneratorType::RandomInteger => {
136 Ok(Value::Number(serde_json::Number::from(crate::generators::random_int(0, 1000000))))
137 },
138 FieldGeneratorType::RandomFloat => {
139 Ok(Value::Number(serde_json::Number::from_f64(crate::generators::random_float(0.0, 1000.0)).unwrap()))
140 },
141 FieldGeneratorType::RandomBoolean => {
142 Ok(Value::Bool(crate::generators::random_bool()))
143 },
144 FieldGeneratorType::CurrentTimestamp => {
145 Ok(Value::String(crate::generators::datetime::iso8601()))
146 },
147 FieldGeneratorType::RandomDate => {
148 Ok(Value::String(crate::generators::datetime::date_iso()))
149 },
150 FieldGeneratorType::RandomDateTime => {
151 Ok(Value::String(crate::generators::datetime::iso8601()))
152 },
153 FieldGeneratorType::RandomEmail => {
154 Ok(Value::String(crate::generators::internet::email()))
155 },
156 FieldGeneratorType::RandomPhone => {
157 Ok(Value::String(crate::generators::number::phone_number_cn()))
158 },
159 FieldGeneratorType::RandomUrl => {
160 Ok(Value::String(crate::generators::internet::url()))
161 },
162 FieldGeneratorType::Uuid => {
163 Ok(Value::String(crate::generators::uuid_v4()))
164 },
165 FieldGeneratorType::Name => {
166 match forge.language() {
168 crate::generation::Language::ZhCN => {
169 Ok(Value::String(crate::generators::name::zh_cn_fullname()))
170 },
171 crate::generation::Language::EnUS => {
172 Ok(Value::String(crate::generators::name::en_us_fullname()))
173 },
174 crate::generation::Language::JaJP => {
175 Ok(Value::String(crate::generators::name::ja_jp_fullname()))
176 },
177 }
178 },
179 FieldGeneratorType::CompanyName => {
180 Ok(Value::String(format!("Company {}", crate::generators::random_int(1, 1000))))
181 },
182 FieldGeneratorType::Address => {
183 match forge.language() {
185 crate::generation::Language::ZhCN => {
186 Ok(Value::String(format!("{}市{}区{}街道{}",
187 crate::generators::address::zh_city(),
188 crate::generators::address::zh_city(),
189 crate::generators::random_int(1, 100),
190 crate::generators::random_int(1, 1000))))
191 },
192 crate::generation::Language::EnUS => {
193 Ok(Value::String(format!("{} Street {}, {}, {}",
194 crate::generators::address::us_city(),
195 crate::generators::random_int(1, 1000),
196 crate::generators::address::us_city(),
197 crate::generators::address::us_state())))
198 },
199 crate::generation::Language::JaJP => {
200 Ok(Value::String(format!("{}{}{}丁目{}",
201 crate::generators::address::us_city(), crate::generators::address::us_city(), crate::generators::random_int(1, 20),
204 crate::generators::random_int(1, 20))))
205 },
206 }
207 },
208 FieldGeneratorType::ProductName => {
209 let products = ["Laptop", "Smartphone", "Tablet", "Watch", "Headphones", "Speaker"];
210 let product = products[crate::generators::random_int(0, products.len() as i32 - 1) as usize];
211 Ok(Value::String(format!("{} {}", product, crate::generators::random_int(1, 1000))))
212 },
213 FieldGeneratorType::OrderStatus => {
214 let statuses = ["Pending", "Processing", "Shipped", "Delivered", "Cancelled"];
215 let status = statuses[crate::generators::random_int(0, statuses.len() as i32 - 1) as usize];
216 Ok(Value::String(status.to_string()))
217 },
218 }
219 }
220}
221
222#[cfg(test)]
223mod tests {
224 use super::*;
225 use crate::db::schema::{FieldConstraints, DataType};
226
227 #[test]
228 fn test_person_field_generation_by_type() {
229 let schema = TableSchema {
231 name: "employees".to_string(),
232 fields: vec![
233 FieldSchema {
234 name: "id".to_string(),
235 data_type: DataType::Integer { min: None, max: None },
236 constraints: FieldConstraints {
237 nullable: false,
238 unique: true,
239 default: None,
240 pattern: None,
241 min: None,
242 max: None,
243 },
244 description: None,
245 generator_config: None,
246 generator_type: None,
247 },
248 FieldSchema {
249 name: "full_name".to_string(),
250 data_type: DataType::String { max_length: Some(100) },
251 constraints: FieldConstraints {
252 nullable: false,
253 unique: false,
254 default: None,
255 pattern: None,
256 min: None,
257 max: None,
258 },
259 description: None,
260 generator_config: None,
261 generator_type: None,
262 },
263 FieldSchema {
264 name: "birth_date".to_string(),
265 data_type: DataType::Date { format: None },
266 constraints: FieldConstraints {
267 nullable: false,
268 unique: false,
269 default: None,
270 pattern: None,
271 min: None,
272 max: None,
273 },
274 description: None,
275 generator_config: None,
276 generator_type: None,
277 },
278 FieldSchema {
279 name: "email_addr".to_string(),
280 data_type: DataType::Email,
281 constraints: FieldConstraints {
282 nullable: false,
283 unique: true,
284 default: None,
285 pattern: None,
286 min: None,
287 max: None,
288 },
289 description: None,
290 generator_config: None,
291 generator_type: None,
292 },
293 ],
294 primary_key: Some(vec!["id".to_string()]),
295 indexes: vec![],
296 description: None,
297 };
298
299 let data = generate_person_data(&schema, 1).unwrap();
301 assert_eq!(data.len(), 1);
302
303 let row = &data[0];
304 assert!(row.contains_key("id"));
305 assert!(row.contains_key("full_name"));
306 assert!(row.contains_key("birth_date"));
307 assert!(row.contains_key("email_addr"));
308
309 assert!(row.get("id").unwrap().is_number());
311 assert!(row.get("full_name").unwrap().is_string());
312 assert!(row.get("birth_date").unwrap().is_string());
313 assert!(row.get("email_addr").unwrap().is_string());
314 }
315
316 #[test]
317 fn test_product_field_generation_by_type() {
318 let schema = TableSchema {
320 name: "products".to_string(),
321 fields: vec![
322 FieldSchema {
323 name: "product_identifier".to_string(),
324 data_type: DataType::Integer { min: None, max: None },
325 constraints: FieldConstraints {
326 nullable: false,
327 unique: true,
328 default: None,
329 pattern: None,
330 min: None,
331 max: None,
332 },
333 description: None,
334 generator_config: None,
335 generator_type: None,
336 },
337 FieldSchema {
338 name: "product_title".to_string(),
339 data_type: DataType::String { max_length: Some(100) },
340 constraints: FieldConstraints {
341 nullable: false,
342 unique: false,
343 default: None,
344 pattern: None,
345 min: None,
346 max: None,
347 },
348 description: None,
349 generator_config: None,
350 generator_type: None,
351 },
352 FieldSchema {
353 name: "unit_price".to_string(),
354 data_type: DataType::Float { min: None, max: None, precision: None },
355 constraints: FieldConstraints {
356 nullable: false,
357 unique: false,
358 default: None,
359 pattern: None,
360 min: None,
361 max: None,
362 },
363 description: None,
364 generator_config: None,
365 generator_type: None,
366 },
367 ],
368 primary_key: Some(vec!["product_identifier".to_string()]),
369 indexes: vec![],
370 description: None,
371 };
372
373 let data = generate_product_data(&schema, 1).unwrap();
375 assert_eq!(data.len(), 1);
376
377 let row = &data[0];
378 assert!(row.contains_key("product_identifier"));
379 assert!(row.contains_key("product_title"));
380 assert!(row.contains_key("unit_price"));
381
382 assert!(row.get("product_identifier").unwrap().is_number());
384 assert!(row.get("product_title").unwrap().is_string());
385 assert!(row.get("unit_price").unwrap().is_number());
386 }
387
388 #[test]
389 fn test_table_type_detection() {
390 let person_schema = TableSchema {
392 name: "users".to_string(),
393 fields: vec![
394 FieldSchema {
395 name: "user_id".to_string(),
396 data_type: DataType::Integer { min: None, max: None },
397 constraints: FieldConstraints::default(),
398 description: None,
399 generator_config: None,
400 generator_type: None,
401 },
402 FieldSchema {
403 name: "email_address".to_string(),
404 data_type: DataType::Email,
405 constraints: FieldConstraints::default(),
406 description: None,
407 generator_config: None,
408 generator_type: None,
409 },
410 ],
411 primary_key: Some(vec!["user_id".to_string()]),
412 indexes: vec![],
413 description: None,
414 };
415
416 let product_schema = TableSchema {
418 name: "items".to_string(),
419 fields: vec![
420 FieldSchema {
421 name: "item_id".to_string(),
422 data_type: DataType::Integer { min: None, max: None },
423 constraints: FieldConstraints::default(),
424 description: None,
425 generator_config: None,
426 generator_type: None,
427 },
428 FieldSchema {
429 name: "item_name".to_string(),
430 data_type: DataType::String { max_length: Some(100) },
431 constraints: FieldConstraints::default(),
432 description: None,
433 generator_config: None,
434 generator_type: None,
435 },
436 FieldSchema {
437 name: "item_price".to_string(),
438 data_type: DataType::Float { min: None, max: None, precision: None },
439 constraints: FieldConstraints::default(),
440 description: None,
441 generator_config: None,
442 generator_type: None,
443 },
444 ],
445 primary_key: Some(vec!["item_id".to_string()]),
446 indexes: vec![],
447 description: None,
448 };
449
450 assert!(is_person_table(&person_schema));
452 assert!(is_product_table(&product_schema));
453 }
454
455 #[test]
456 fn test_field_type_based_generation() {
457 let schema = TableSchema {
459 name: "mixed_table".to_string(),
460 fields: vec![
461 FieldSchema {
462 name: "any_integer_field".to_string(),
463 data_type: DataType::Integer { min: Some(0), max: Some(100) },
464 constraints: FieldConstraints::default(),
465 description: None,
466 generator_config: None,
467 generator_type: None,
468 },
469 FieldSchema {
470 name: "any_float_field".to_string(),
471 data_type: DataType::Float { min: Some(0.0), max: Some(100.0), precision: None },
472 constraints: FieldConstraints::default(),
473 description: None,
474 generator_config: None,
475 generator_type: None,
476 },
477 FieldSchema {
478 name: "any_string_field".to_string(),
479 data_type: DataType::String { max_length: Some(50) },
480 constraints: FieldConstraints::default(),
481 description: None,
482 generator_config: None,
483 generator_type: None,
484 },
485 FieldSchema {
486 name: "any_email_field".to_string(),
487 data_type: DataType::Email,
488 constraints: FieldConstraints::default(),
489 description: None,
490 generator_config: None,
491 generator_type: None,
492 },
493 FieldSchema {
494 name: "any_phone_field".to_string(),
495 data_type: DataType::Phone { country: None },
496 constraints: FieldConstraints::default(),
497 description: None,
498 generator_config: None,
499 generator_type: None,
500 },
501 FieldSchema {
502 name: "any_date_field".to_string(),
503 data_type: DataType::Date { format: None },
504 constraints: FieldConstraints::default(),
505 description: None,
506 generator_config: None,
507 generator_type: None,
508 },
509 FieldSchema {
510 name: "any_datetime_field".to_string(),
511 data_type: DataType::DateTime { format: None },
512 constraints: FieldConstraints::default(),
513 description: None,
514 generator_config: None,
515 generator_type: None,
516 },
517 FieldSchema {
518 name: "any_boolean_field".to_string(),
519 data_type: DataType::Boolean,
520 constraints: FieldConstraints::default(),
521 description: None,
522 generator_config: None,
523 generator_type: None,
524 },
525 ],
526 primary_key: Some(vec!["any_integer_field".to_string()]),
527 indexes: vec![],
528 description: None,
529 };
530
531 let data = GenericDataGenerator::generate_data_by_schema(&schema, 1).unwrap();
533 assert_eq!(data.len(), 1);
534
535 let row = &data[0];
536 assert!(row.contains_key("any_integer_field"));
537 assert!(row.contains_key("any_float_field"));
538 assert!(row.contains_key("any_string_field"));
539 assert!(row.contains_key("any_email_field"));
540 assert!(row.contains_key("any_phone_field"));
541 assert!(row.contains_key("any_date_field"));
542 assert!(row.contains_key("any_datetime_field"));
543 assert!(row.contains_key("any_boolean_field"));
544
545 assert!(row.get("any_integer_field").unwrap().is_number());
547 assert!(row.get("any_float_field").unwrap().is_number());
548 assert!(row.get("any_string_field").unwrap().is_string());
549 assert!(row.get("any_email_field").unwrap().is_string());
550 assert!(row.get("any_phone_field").unwrap().is_string());
551 assert!(row.get("any_date_field").unwrap().is_string());
552 assert!(row.get("any_datetime_field").unwrap().is_string());
553 assert!(row.get("any_boolean_field").unwrap().is_boolean());
554 }
555
556 fn is_person_table(schema: &TableSchema) -> bool {
558 let name_field_count = schema.fields.iter().filter(|field| {
559 field.name.contains("name") || field.name.contains("first") || field.name.contains("last") ||
560 field.name.contains("user") || field.name.contains("employee")
561 }).count();
562
563 let type_field_count = schema.fields.iter().filter(|field| {
564 matches!(field.data_type, DataType::Email | DataType::Phone { .. })
565 }).count();
566
567 name_field_count > 1 || type_field_count > 0
568 }
569
570 fn is_product_table(schema: &TableSchema) -> bool {
572 let name_field_count = schema.fields.iter().filter(|field| {
573 field.name.contains("name") || field.name.contains("title") || field.name.contains("sku")
574 }).count();
575
576 let price_field_count = schema.fields.iter().filter(|field| {
577 field.name.contains("price") || field.name.contains("cost")
578 }).count();
579
580 let type_field_count = schema.fields.iter().filter(|field| {
581 matches!(field.data_type, DataType::Float { .. } | DataType::Integer { .. }) &&
582 (field.name.contains("price") || field.name.contains("cost") || field.name.contains("stock"))
583 }).count();
584
585 name_field_count > 0 || price_field_count > 0 || type_field_count > 0
586 }
587
588 fn is_order_table(schema: &TableSchema) -> bool {
590 let id_field_count = schema.fields.iter().filter(|field| {
591 field.name.contains("order") || field.name.contains("customer")
592 }).count();
593
594 let amount_field_count = schema.fields.iter().filter(|field| {
595 field.name.contains("amount") || field.name.contains("total")
596 }).count();
597
598 let type_field_count = schema.fields.iter().filter(|field| {
599 matches!(field.data_type, DataType::Float { .. } | DataType::Integer { .. }) &&
600 (field.name.contains("amount") || field.name.contains("total") || field.name.contains("quantity"))
601 }).count();
602
603 id_field_count > 0 || amount_field_count > 0 || type_field_count > 0
604 }
605
606 fn is_company_table(schema: &TableSchema) -> bool {
608 let name_field_count = schema.fields.iter().filter(|field| {
609 field.name.contains("company") || field.name.contains("industry")
610 }).count();
611
612 let employee_field_count = schema.fields.iter().filter(|field| {
613 field.name.contains("employee") || field.name.contains("founded")
614 }).count();
615
616 name_field_count > 0 || employee_field_count > 0
617 }
618
619 fn is_address_table(schema: &TableSchema) -> bool {
621 let address_field_count = schema.fields.iter().filter(|field| {
622 field.name.contains("address") || field.name.contains("street") || field.name.contains("city") ||
623 field.name.contains("province") || field.name.contains("state") || field.name.contains("postal") ||
624 field.name.contains("zip")
625 }).count();
626
627 let type_field_count = schema.fields.iter().filter(|field| {
628 matches!(field.data_type, DataType::Phone { .. }) && field.name.contains("phone")
629 }).count();
630
631 address_field_count > 1 || type_field_count > 0
632 }
633
634 fn is_event_table(schema: &TableSchema) -> bool {
636 let name_field_count = schema.fields.iter().filter(|field| {
637 field.name.contains("event") || field.name.contains("name") || field.name.contains("title")
638 }).count();
639
640 let type_field_count = schema.fields.iter().filter(|field| {
641 field.name.contains("type") || field.name.contains("description")
642 }).count();
643
644 let time_field_count = schema.fields.iter().filter(|field| {
645 matches!(field.data_type, DataType::DateTime { .. } | DataType::Date { .. }) &&
646 (field.name.contains("timestamp") || field.name.contains("date"))
647 }).count();
648
649 name_field_count > 0 || type_field_count > 0 || time_field_count > 0
650 }
651
652 pub fn generate_product_data(schema: &TableSchema, count: usize) -> Result<Vec<HashMap<String, Value>>> {
654 let forge = DataForge::new(crate::generation::Language::ZhCN);
655 let mut data = Vec::with_capacity(count);
656 for i in 1..=count {
657 let mut row = HashMap::new();
658
659 for field in &schema.fields {
660 let value = generate_product_field_value(&forge, field, i)?;
661 row.insert(field.name.clone(), value);
662 }
663
664 data.push(row);
665 }
666 Ok(data)
667 }
668
669 fn generate_product_field_value(forge: &DataForge, field: &FieldSchema, index: usize) -> Result<Value> {
671 if let Some(generator_type) = &field.generator_type {
673 return GenericDataGenerator::generate_value_by_generator_type(forge, field, generator_type);
674 }
675
676 match &field.data_type {
678 DataType::String { max_length } => {
679 let max_len = max_length.unwrap_or(255) as usize;
680 if field.name.contains("name") || field.name.contains("title") || field.name.contains("product") {
681 let products = ["Laptop", "Smartphone", "Tablet", "Watch", "Headphones", "Speaker"];
682 let product = products[number::random_int(0, products.len() as i32 - 1) as usize];
683 Ok(Value::String(format!("{} {}", product, index)))
684 } else if field.name.contains("description") {
685 Ok(Value::String(format!("Description for product {}", index)))
686 } else if field.name.contains("sku") {
687 Ok(Value::String(format!("SKU-{:06}", index)))
688 } else {
689 let len = std::cmp::min(10, max_len);
691 Ok(Value::String(random_letters(len)))
692 }
693 },
694 DataType::Integer { min, max } => {
695 let min_val = min.unwrap_or(0);
696 let max_val = max.unwrap_or(1000000);
697 if field.name.contains("stock") {
698 Ok(Value::Number(serde_json::Number::from(number::random_int(0, 1000))))
699 } else {
700 Ok(Value::Number(serde_json::Number::from(number::random_int(min_val as i32, max_val as i32))))
702 }
703 },
704 DataType::Float { .. } => {
705 if field.name.contains("price") || field.name.contains("cost") {
706 Ok(Value::Number(serde_json::Number::from_f64(number::random_float(10.0, 1000.0)).unwrap()))
707 } else {
708 Ok(Value::Number(serde_json::Number::from_f64(number::random_float(0.0, 100.0)).unwrap()))
709 }
710 },
711 DataType::Boolean => {
712 Ok(Value::Bool(rand::random()))
713 },
714 DataType::DateTime { .. } | DataType::Date { .. } => {
715 Ok(Value::String(datetime::iso8601()))
716 },
717 _ => {
718 Ok(Value::String(random_letters(10)))
720 }
721 }
722 }
723
724 pub fn generate_person_data(schema: &TableSchema, count: usize) -> Result<Vec<HashMap<String, Value>>> {
726 let forge = DataForge::new(crate::generation::Language::ZhCN);
728
729 let mut data = Vec::with_capacity(count);
730 for i in 1..=count {
731 let mut row = HashMap::new();
732
733 for field in &schema.fields {
734 let value = generate_person_field_value(&forge, field, i)?;
735 row.insert(field.name.clone(), value);
736 }
737
738 data.push(row);
739 }
740 Ok(data)
741 }
742
743 fn generate_person_field_value(forge: &DataForge, field: &FieldSchema, _index: usize) -> Result<Value> {
745 if let Some(generator_type) = &field.generator_type {
747 return GenericDataGenerator::generate_value_by_generator_type(forge, field, generator_type);
748 }
749
750 match &field.data_type {
752 DataType::String { max_length } => {
753 let max_len = max_length.unwrap_or(255) as usize;
754 if field.name.contains("name") || field.name.contains("user") || field.name.contains("employee") {
755 match forge.language() {
757 crate::generation::Language::ZhCN => {
758 Ok(Value::String(crate::generators::name::zh_cn_fullname()))
759 },
760 crate::generation::Language::EnUS => {
761 Ok(Value::String(crate::generators::name::en_us_fullname()))
762 },
763 crate::generation::Language::JaJP => {
764 Ok(Value::String(crate::generators::name::ja_jp_fullname()))
765 },
766 }
767 } else if field.name.contains("email") {
768 Ok(Value::String(crate::generators::internet::email()))
769 } else if field.name.contains("phone") {
770 Ok(Value::String(crate::generators::number::phone_number_cn()))
771 } else {
772 let len = std::cmp::min(10, max_len);
774 Ok(Value::String(random_letters(len)))
775 }
776 },
777 DataType::Integer { min, max } => {
778 let min_val = min.unwrap_or(0);
779 let max_val = max.unwrap_or(1000000);
780 if field.name.contains("age") {
781 Ok(Value::Number(serde_json::Number::from(number::random_int(18, 65))))
782 } else if field.name.contains("salary") || field.name.contains("wage") {
783 Ok(Value::Number(serde_json::Number::from(number::random_int(3000, 50000))))
784 } else {
785 Ok(Value::Number(serde_json::Number::from(number::random_int(min_val as i32, max_val as i32))))
787 }
788 },
789 DataType::Float { .. } => {
790 if field.name.contains("salary") || field.name.contains("wage") {
791 Ok(Value::Number(serde_json::Number::from_f64(number::random_float(3000.0, 50000.0)).unwrap()))
792 } else {
793 Ok(Value::Number(serde_json::Number::from_f64(number::random_float(0.0, 100.0)).unwrap()))
794 }
795 },
796 DataType::Boolean => {
797 Ok(Value::Bool(rand::random()))
798 },
799 DataType::DateTime { .. } | DataType::Date { .. } => {
800 if field.name.contains("birth") {
801 Ok(Value::String(datetime::birthday()))
802 } else {
803 Ok(Value::String(datetime::iso8601()))
804 }
805 },
806 DataType::Email => {
807 Ok(Value::String(crate::generators::internet::email()))
808 },
809 DataType::Phone { .. } => {
810 Ok(Value::String(crate::generators::number::phone_number_cn()))
811 },
812 _ => {
813 Ok(Value::String(random_letters(10)))
815 }
816 }
817 }
818
819}