use std::fmt;
#[derive(Debug, Clone)]
pub struct SeedResult {
pub executed: Vec<SeedInfo>,
pub skipped: Vec<SeedInfo>,
pub rolled_back: Vec<SeedInfo>,
}
impl SeedResult {
pub(super) fn new() -> Self {
Self {
executed: Vec::new(),
skipped: Vec::new(),
rolled_back: Vec::new(),
}
}
pub fn has_executed(&self) -> bool {
!self.executed.is_empty()
}
pub fn has_rolled_back(&self) -> bool {
!self.rolled_back.is_empty()
}
pub fn total(&self) -> usize {
self.executed.len() + self.skipped.len() + self.rolled_back.len()
}
}
impl fmt::Display for SeedResult {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if !self.executed.is_empty() {
writeln!(f, "Executed seeds:")?;
for seed in &self.executed {
writeln!(f, " ✓ {}", seed.name)?;
}
}
if !self.skipped.is_empty() {
writeln!(f, "Skipped seeds (already executed):")?;
for seed in &self.skipped {
writeln!(f, " - {}", seed.name)?;
}
}
if !self.rolled_back.is_empty() {
writeln!(f, "Rolled back seeds:")?;
for seed in &self.rolled_back {
writeln!(f, " ↩ {}", seed.name)?;
}
}
Ok(())
}
}
#[derive(Debug, Clone)]
pub struct SeedInfo {
pub name: String,
}
#[derive(Debug, Clone)]
pub struct SeedStatus {
pub name: String,
pub executed: bool,
pub priority: u32,
}
impl fmt::Display for SeedStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let status = if self.executed { "✓" } else { "○" };
write!(
f,
"[{}] {} (priority: {})",
status, self.name, self.priority
)
}
}