Skip to main content

doido_generators/generators/
controller.rs

1use crate::generator::{GeneratedFile, Generator};
2use crate::generators::helper::{
3    helper_names, helpers_mod_path, read_helpers_mod, register_helper_in_mod, render_helper_content,
4};
5use crate::generators::{to_pascal, to_snake};
6use doido_core::Result;
7
8pub struct ControllerGenerator;
9
10impl Generator for ControllerGenerator {
11    fn name(&self) -> &str {
12        "controller"
13    }
14
15    fn generate(&self, args: &[&str]) -> Result<Vec<GeneratedFile>> {
16        let name = args.first().copied().ok_or_else(|| {
17            doido_core::anyhow::anyhow!("controller generator requires a name argument")
18        })?;
19        let snake = to_snake(name);
20        let pascal = to_pascal(name);
21        let (_, helper_type) = helper_names(name);
22        let content = crate::templates::get("controller/controller.rs.template")
23            .replace("{pascal}", &pascal)
24            .replace("{snake}", &snake)
25            .replace("{Helper}", &helper_type);
26        let test = crate::templates::get("controller/controller_test.rs.template")
27            .replace("{pascal}", &pascal)
28            .replace("{snake}", &snake);
29        let (helper_snake, _) = helper_names(name);
30        let helpers_mod = register_helper_in_mod(&read_helpers_mod(), name);
31        Ok(vec![
32            GeneratedFile {
33                path: format!("app/helpers/{helper_snake}.rs"),
34                content: render_helper_content(name, &snake),
35            },
36            GeneratedFile {
37                path: helpers_mod_path().to_string(),
38                content: helpers_mod,
39            },
40            GeneratedFile {
41                path: format!("src/controllers/{snake}_controller.rs"),
42                content,
43            },
44            GeneratedFile {
45                path: format!("tests/{snake}_controller_test.rs"),
46                content: test,
47            },
48        ])
49    }
50}