a tool for code gen via templates
just_template gens repetitive code using three core concepts: impl_mark, impl_area, and param.
-
impl_mark Mark an "impl point" with a line starting with 10
>chars:>>>>>>>>>> NAME. Used for positioning. The system extracts the matchingimpl_areacontent and expands it here. -
impl_area Declare a reusable code template:
@@@ NAME >>>[template content]@@@ <<<Inside, use param placeholders like<<<PARAM>>>. When adding an impl via cmd (e.g.,insert_impl!), the system copies the area, replaces params, and appends to the impl_mark. -
param
- Params outside an impl_area are replaced globally.
- Params inside are replaced per-impl when generating.
Example:
Template:
// Auto generated
use std::collections::HashMap;
pub async fn my_func(
name: &str,
data: &[u8],
params: &HashMap<String, String>,
) -> Option<Result<Vec<u32>, std::io::Error>> {
match name {
>>>>>>>>>> arms
@@@ >>> arms
"<<<crate_name>>>" => Some(<<<crate_name>>>::exec(data, params).await),
@@@ <<<
_ => None,
}
}Run cmds:
tmpl!(tmpl += {
arms {
(crate_name = "my"),
(crate_name = "you")
}
});The arms impl_area becomes:
"my" => Some(my::exec(data, params).await),
"you" => Some(you::exec(data, params).await),Final expanded code:
// Auto generated
use std::collections::HashMap;
pub async fn my_func(
name: &str,
data: &[u8],
params: &HashMap<String, String>,
) -> Option<Result<Vec<u32>, std::io::Error>> {
match name {
"my" => Some(my::exec(data, params).await),
"you" => Some(you::exec(data, params).await),
_ => None,
}
}Add this to your Cargo.toml:
[dependencies]
just_template = "0.1"This project is dual-licensed under MIT and Apache 2.0. See the LICENSE file for details.