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