Skip to main content

doido_generators/generators/
migration.rs

1use crate::generator::{GeneratedFile, Generator};
2use crate::generators::to_snake;
3use chrono::Utc;
4use doido_core::Result;
5
6pub struct MigrationGenerator;
7
8impl Generator for MigrationGenerator {
9    fn name(&self) -> &str {
10        "migration"
11    }
12
13    fn generate(&self, args: &[&str]) -> Result<Vec<GeneratedFile>> {
14        let name = args.first().copied().ok_or_else(|| {
15            doido_core::anyhow::anyhow!("migration generator requires a name argument")
16        })?;
17        let timestamp = Utc::now().format("%Y%m%d%H%M%S");
18        let snake = to_snake(name);
19        let test = crate::templates::get("migration/migration_test.rs.template")
20            .replace("{snake}", &snake);
21        Ok(vec![
22            GeneratedFile {
23                path: format!("db/migrations/{}_{}.rs", timestamp, snake),
24                content: crate::templates::get("migration/migration.rs.template"),
25            },
26            GeneratedFile {
27                path: format!("tests/{snake}_migration_test.rs"),
28                content: test,
29            },
30        ])
31    }
32}