kenzu 0.0.2

Procedural macros for builder pattern generation and validation
Documentation
# `kenzu`

[![Crates.io](https://img.shields.io/crates/v/kenzu.svg)](https://crates.io/crates/kenzu)
[![Docs.rs](https://docs.rs/kenzu/badge.svg)](https://docs.rs/kenzu)
[![License](https://img.shields.io/crates/l/kenzu.svg)](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

[![Monero](https://img.shields.io/badge/88NKLkhZf1nTVpaSU6vwG6dwBwb9tFVSM8Lpj3YqdL1PMt8Gm7opV7aUnMYBaAC9Y6a4kfDc3fLGoMVqeSJKNphyLpLdEvC-FF6600?style=flat&logo=monero&logoColor=white)](https://github.com/pas2rust/pas2rust/blob/main/pas-monero-donate.png)
[![Bitcoin](https://img.shields.io/badge/bc1qnlayyh84e9u5pd4m9g9sf4c5zdzswvkmudmdu5-EAB300?style=flat&logo=bitcoin&logoColor=white)](https://github.com/pas2rust/pas2rust/blob/main/pas-bitcoin-donate.png)