kenzu 0.0.3

Procedural macros for builder pattern generation and validation
Documentation

kenzu

Crates.io Docs.rs License GitHub top language GitHub stars GitHub forks GitHub last commit

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:

cargo add kenzu

๐Ÿš€ Usage

Builder

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

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 Bitcoin