workspace-template/post-generate.rhai
2026-01-17 22:22:16 +10:30

78 lines
1.7 KiB
Plaintext

// Post-generation hook: creates crates based on user input
let crates_input = variable::get("crates");
let project_name = variable::get("project-name");
let author = variable::get("author");
let license = variable::get("license");
// Parse comma-separated crate names
let crate_names = crates_input.split(",");
for crate_name in crate_names {
let crate_name = crate_name.trim();
if crate_name.is_empty() {
continue;
}
let crate_dir = `crates/${crate_name}`;
let src_dir = `${crate_dir}/src`;
// Create directories
file::create_dir(crate_dir);
file::create_dir(src_dir);
// Determine if this looks like a binary crate
let is_bin = crate_name.contains("cli") || crate_name.contains("bin") || crate_name == "app";
// Create Cargo.toml
let cargo_toml = `[package]
name = "${project_name}-${crate_name}"
version.workspace = true
edition.workspace = true
authors.workspace = true
license.workspace = true
description = ""
[dependencies]
[lints]
workspace = true
`;
if is_bin {
cargo_toml = `[package]
name = "${project_name}-${crate_name}"
version.workspace = true
edition.workspace = true
authors.workspace = true
license.workspace = true
description = ""
[[bin]]
name = "${project_name}"
path = "src/main.rs"
[dependencies]
[lints]
workspace = true
`;
}
file::write(`${crate_dir}/Cargo.toml`, cargo_toml);
// Create src/lib.rs or src/main.rs
if is_bin {
file::write(`${src_dir}/main.rs`, `fn main() {
println!("Hello from ${project_name}!");
}
`);
} else {
file::write(`${src_dir}/lib.rs`, `//! ${crate_name} crate for ${project_name}.
`);
}
}
// Clean up the placeholder .gitkeep directory
file::delete("crates/.gitkeep");