sz_orm_core/seeding/
mod.rs1pub mod faker;
7pub mod fixture;
8pub mod manager;
9
10pub use faker::FakerGenerator;
11pub use fixture::{FixtureLoader, FixtureTemplate, Reference};
12pub use manager::{SeedEnv, SeedFile, SeedManager, SeedMode, SeedReport};
13
14use serde_json::Value;
15use thiserror::Error;
16
17pub trait FieldGenerator: Send + Sync {
19 fn generate(&self, rng: &mut rand::rngs::StdRng) -> Value;
21}
22
23#[derive(Debug, Clone, PartialEq, Eq)]
25pub enum FieldType {
26 String,
28 I32,
30 U32,
32 I64,
34 U64,
36 F64,
38 Boolean,
40 Uuid,
42 DateTime,
44 Json,
46 Enum(Vec<String>),
48}
49
50#[derive(Debug, Clone)]
52pub struct FieldDef {
53 pub name: String,
55 pub field_type: FieldType,
57 pub nullable: bool,
59}
60
61#[derive(Debug, Clone)]
63pub struct ModelDef {
64 pub table: String,
66 pub fields: Vec<FieldDef>,
68}
69
70#[derive(Debug, Error)]
72pub enum SeedError {
73 #[error("production seeding forbidden: set allow_production=true to override")]
75 EnvForbidden,
76 #[error("dependency cycle detected: {chain}")]
78 DependencyCycle {
79 chain: String,
81 },
82 #[error("fixture parse failed at {path}: {reason}")]
84 FixtureParseFailed {
85 path: String,
87 reason: String,
89 },
90 #[error("seed execution failed at version {version}: {reason}")]
92 SeedExecution {
93 version: String,
95 reason: String,
97 },
98 #[error("invalid config: {0}")]
100 InvalidConfig(String),
101 #[error("io error: {0}")]
103 Io(#[from] std::io::Error),
104 #[error("yaml parse error: {0}")]
106 Yaml(#[from] serde_yaml::Error),
107 #[error("json parse error: {0}")]
109 Json(#[from] serde_json::Error),
110}
111
112pub type Record = serde_json::Map<String, Value>;
114
115#[cfg(test)]
116mod tests {
117 use super::*;
118
119 #[test]
120 fn test_field_type_equality() {
121 assert_eq!(FieldType::String, FieldType::String);
122 assert_ne!(FieldType::I32, FieldType::U32);
123 }
124
125 #[test]
126 fn test_seed_error_display() {
127 let err = SeedError::EnvForbidden;
128 assert!(err.to_string().contains("production seeding forbidden"));
129
130 let err = SeedError::DependencyCycle {
131 chain: "A<-B<-A".to_string(),
132 };
133 assert!(err.to_string().contains("A<-B<-A"));
134 }
135}