arcature-cli 2026.2.0

Developer lifecycle CLI for Arcature applications.
Documentation
//! `arc make module <name>` — generate a minimal module directory + `mod.rs`.
//!
//! Creates `src/<name>/mod.rs` with a `module!` declaration. Per PROGRAM.md
//! §"arc make module": generates minimal module structure; does NOT generate
//! controllers/services/etc until requested. The directory name is lowercase
//! (e.g. `links`); the `module!` macro name is the PascalCase form (e.g.
//! `Links`).

use std::path::Path;

use super::naming::{ensure_missing, pascal_case, validate_module_name};
use super::write::GeneratedFile;

/// Generate a module at `<src_root>/<name>/mod.rs`. Returns the generated
/// file (not yet written) or an error string. `src_root` is the application
/// source root (ADR-0008: `backend_src_dir`, e.g. `app/`).
pub(crate) fn generate(src_root: &Path, raw_name: &str) -> Result<GeneratedFile, String> {
    let name = validate_module_name(raw_name)?;
    let dir = src_root.join(&name);
    let mod_rs = dir.join("mod.rs");
    ensure_missing(&mod_rs)?;
    let content = render(&name);
    Ok(GeneratedFile {
        path: mod_rs,
        content,
    })
}

fn render(name: &str) -> String {
    let pascal = pascal_case(name);
    format!(
        "//! The `{name}` feature module.\n\
         \n\
         use arcature::prelude::*;\n\
         \n\
         arcature::arcature_dx::module! {{\n\
         \x20   pub {pascal} {{\n\
         \x20   }}\n\
         }}\n"
    )
}