# `kenzu`
[](https://crates.io/crates/kenzu)
[](https://docs.rs/kenzu)
[](https://github.com/pas2rust/kenzu/blob/main/LICENSE)
**`kenzu`** is a procedural macro crate for generating **builder patterns** in Rust โ both **immutable** and **mutable**, with optional compile-time validation using field-level attributes.
Whether you're building configuration structs, domain models, or input data, `kenzu` eliminates boilerplate while increasing safety and clarity.
---
## โจ Features
- ๐งฑ `Builder`: Generates **immutable**, fluent `.build()`-based builders.
- ๐ `M_Builder`: Generates **mutable** builders using `&mut self` methods.
- ๐งฐ Field-level defaults with `#[set(value = "...")]`.
- ๐ Regex-based validation with `#[build(pattern = ..., err = ...)]`.
- ๐ข Range validation with `#[range(min = ..., max = ..., err = ...)]`.
- ๐งผ Skip trait generation with `#[skip_trait]`, or skip setters with `#[set(skip)]`.
- โ Compile-time validation of regex patterns โ invalid patterns produce macro errors.
---
## โ๏ธ Installation
Add it to your `Cargo.toml`:
```bash
cargo add kenzu
```
## ๐ Usage
### Builder
```rust
use kenzu::Builder;
#[derive(Builder)]
pub struct User {
pub id: String,
#[set(value = "default-name")]
pub name: String,
pub password: String,
#[build(pattern = r"^[^@]+@[^@]+\.[^@]+$", err = "invalid email")]
#[set(value = "user@example.com")]
pub email: String,
#[range(min = 18, max = 99, err = "invalid age")]
#[set(value = 18)]
pub age: u8,
}
let user = User::new()
.id("001")
.name("Alice")
.password("hunter2")
.email("alice@example.com")
.age(30)
.build()
.unwrap();
```
### Mutable Builder
```rust
use kenzu::M_Builder;
#[derive(M_Builder)]
pub struct User<'a> {
#[set(value = "uuid")]
pub id: String,
#[set(value = "default")]
pub name: String,
pub password: String,
#[build(pattern = r"^[^@]+@[^@]+\.[^@]+$", err = "invalid email")]
#[set(value = "email@example.com")]
pub email: String,
pub fix: &'a str,
#[set(value = 18)]
pub age: u8,
#[set(skip)]
pub code: u8,
pub def: String,
}
let mut user = User::new();
user.id("123")
.name("Bob")
.password("pass123")
.email("bob@example.com")
.fix("ref")
.def("value")
.age(42)
.build()
.unwrap();
```
# โค๏ธ Donate
[](https://github.com/pas2rust/pas2rust/blob/main/pas-monero-donate.png)
[](https://github.com/pas2rust/pas2rust/blob/main/pas-bitcoin-donate.png)