rust-db-blueprint 0.1.0

A Rust code generator — reads YAML draft files and generates Axum + SQLx models, migrations, handlers, routes, requests, tests, and seeds
Documentation
use indexmap::IndexMap;
use serde::{Deserialize, Serialize};

use crate::models::*;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Tree {
    pub models: IndexMap<String, ModelDef>,
    pub controllers: IndexMap<String, Controller>,
    pub seeders: Vec<String>,
    pub config: TreeConfig,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TreeConfig {
    pub generate_phpunit: bool,
    pub generate_pest: bool,
    pub forms: bool,
    pub pagination: bool,
}

impl Default for TreeConfig {
    fn default() -> Self {
        Self {
            generate_phpunit: true,
            generate_pest: false,
            forms: true,
            pagination: true,
        }
    }
}

impl Tree {
    pub fn new() -> Self {
        Self {
            models: IndexMap::new(),
            controllers: IndexMap::new(),
            seeders: vec![],
            config: TreeConfig::default(),
        }
    }

    pub fn model_for_context(&self, context: &str) -> Option<&ModelDef> {
        // Try exact match first
        if let Some(model) = self.models.get(context) {
            return Some(model);
        }
        // Try singular version
        let singular = context.trim_end_matches('s');
        if let Some(model) = self.models.get(singular) {
            return Some(model);
        }
        // Try plural version
        let plural = format!("{}s", context);
        if let Some(model) = self.models.get(&plural) {
            return Some(model);
        }
        None
    }

    pub fn all_models(&self) -> Vec<&ModelDef> {
        self.models.values().collect()
    }

    pub fn all_controllers(&self) -> Vec<&Controller> {
        self.controllers.values().collect()
    }
}

impl Default for Tree {
    fn default() -> Self {
        Self::new()
    }
}