pub mod faker;
pub mod fixture;
pub mod manager;
pub use faker::FakerGenerator;
pub use fixture::{FixtureLoader, FixtureTemplate, Reference};
pub use manager::{SeedEnv, SeedFile, SeedManager, SeedMode, SeedReport};
use serde_json::Value;
use thiserror::Error;
pub trait FieldGenerator: Send + Sync {
fn generate(&self, rng: &mut rand::rngs::StdRng) -> Value;
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum FieldType {
String,
I32,
U32,
I64,
U64,
F64,
Boolean,
Uuid,
DateTime,
Json,
Enum(Vec<String>),
}
#[derive(Debug, Clone)]
pub struct FieldDef {
pub name: String,
pub field_type: FieldType,
pub nullable: bool,
}
#[derive(Debug, Clone)]
pub struct ModelDef {
pub table: String,
pub fields: Vec<FieldDef>,
}
#[derive(Debug, Error)]
pub enum SeedError {
#[error("production seeding forbidden: set allow_production=true to override")]
EnvForbidden,
#[error("dependency cycle detected: {chain}")]
DependencyCycle {
chain: String,
},
#[error("fixture parse failed at {path}: {reason}")]
FixtureParseFailed {
path: String,
reason: String,
},
#[error("seed execution failed at version {version}: {reason}")]
SeedExecution {
version: String,
reason: String,
},
#[error("invalid config: {0}")]
InvalidConfig(String),
#[error("io error: {0}")]
Io(#[from] std::io::Error),
#[error("yaml parse error: {0}")]
Yaml(#[from] serde_yaml::Error),
#[error("json parse error: {0}")]
Json(#[from] serde_json::Error),
}
pub type Record = serde_json::Map<String, Value>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_field_type_equality() {
assert_eq!(FieldType::String, FieldType::String);
assert_ne!(FieldType::I32, FieldType::U32);
}
#[test]
fn test_seed_error_display() {
let err = SeedError::EnvForbidden;
assert!(err.to_string().contains("production seeding forbidden"));
let err = SeedError::DependencyCycle {
chain: "A<-B<-A".to_string(),
};
assert!(err.to_string().contains("A<-B<-A"));
}
}