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> {
if let Some(model) = self.models.get(context) {
return Some(model);
}
let singular = context.trim_end_matches('s');
if let Some(model) = self.models.get(singular) {
return Some(model);
}
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()
}
}