rumbok
rumbok is a Lombok-inspired derive macro library for Rust.
It provides Getter, Setter, and Data derive macros to reduce boilerplate code,
while keeping Rust's ownership and borrowing semantics explicit and safe.
✨ Features
#[derive(Setter)]- Generates
set_xxx(&mut self, value: T)methods
- Generates
#[derive(Getter)]- Generates
get_xxx(&self) -> &T/&strmethods
- Generates
#[derive(Data)]- Generates both Getter and Setter
- Field-level attribute controls:
#[getter(skip)]– Skip generating a getter for the field#[setter(skip)]– Skip generating a setter for the field#[getter(clone)]– Generate a getter that returns an owned value (T)
- Supports generics, lifetimes, and
whereclauses - Correctly handles owned types and reference types
- UI tests using
trybuild(including compile-fail cases)
📦 Installation
[]
= "0.1"
🚀 Basic Usage
Data (Getter + Setter)
use Data;
🧩 Individual Derives
Setter
use Setter;
Skip setter generation
You can skip generating a setter for a specific field using #[setter(skip)]:
use Setter;
Getter
use Getter;
Getter rules:
| Field Type | Return Type |
|---|---|
T |
&T |
&T |
&T |
&mut T |
&T |
Skip getter generation
You can skip generating a getter for a specific field using #[getter(skip)]:
use Getter;
Getter by value (clone)
By default, getters return references.
Using #[getter(clone)], you can generate a getter that returns an owned value:
use Getter;
Notes:
- The field type must implement
Clone - If the type does not implement
Clone, a compile-time error will occur
🧠 Design Philosophy
- Do not hide Rust's ownership and borrowing rules
- Prefer explicit and predictable APIs
- Avoid guessing trait implementations such as
Copy - Attribute options such as
skipandcloneare explicit and never inferred
Getters always return references by design unless explicitly specified.
⚠️ Limitations
- Tuple structs and unit structs are not supported
- Enum types are not supported
- No automatic
Copydetection
🧪 Testing
This crate uses:
- Unit tests for macro expansion
- UI tests with
trybuild
🔍 Debugging Macros
To inspect expanded macros, use cargo-expand:
📄 License
Licensed under either of:
- MIT License
🙌 Motivation
Inspired by Java's Lombok, this project aims to:
- Reduce boilerplate
- Preserve Rust's safety guarantees
- Provide simple and predictable derive macros
🚧 Roadmap
#[getter(by_value)]- Option-aware getters
#[derive(Value)]#[derive(Constructor)]
Enjoy writing less boilerplate with rumbok ✨