Expand description
§rusttoolkit - Universal Rust Meta-Programming Toolkit
Provides the for_each!
macro for eliminating repetitive code patterns through powerful iteration
with built-in case transformation support.
§Features
- Multiple item types: Identifiers, strings, numbers, and arrays
- Array indexing: Access elements with
%{param[0]}
,%{param[1]}
, etc. - Case transformations: Built-in support for snake_case, camelCase, kebab-case, PascalCase, UPPER_CASE, and more
- Clean syntax: Uses
%{param}
and%{param:transform}
to avoid conflicts with Rust syntax - Template flexibility: Multiple parameter references and transforms in same template
- Production ready: Comprehensive test coverage and optimized implementation
§Quick Start
use rusttoolkit::for_each;
// Single items - generates error(), warn(), info() functions
for_each!([error, warn, info], |level| {
pub fn %{level}(msg: &str) {
println!("[{}] {}", stringify!(%{level}).to_uppercase(), msg);
}
});
// Array items - generates status_GET(), status_POST() functions
for_each!([["GET", 200], ["POST", 201]], |req| {
pub fn status_%{req[0]}() -> u16 {
%{req[1]}
}
});
// Case transformations - generates get_user_data_log!(), create_post_log!() macros
for_each!([getUserData, createPost], |method| {
macro_rules! %{method:snake}_log {
($msg:expr) => {
format!("[{}] {}", "%{method:upper}", $msg)
};
}
});
§Template Syntax - %{}
Notation
The %{}
notation is our special template syntax that gets replaced during macro expansion:
§Basic Usage
%{param}
- Replace with single item value%{param[0]}
- Replace with first array element%{param[1]}
- Replace with second array element- Multiple references supported in same template
§Case Transformations
%{param:snake}
- Convert to snake_case: getUserData → get_user_data%{param:camel}
- Convert to camelCase: getUserData → getUserData%{param:kebab}
- Convert to kebab-case: getUserData → get-user-data%{param:pascal}
- Convert to PascalCase: getUserData → GetUserData%{param:title}
- Convert to Title Case: getUserData → Get User Data%{param:upper}
- Convert to UPPERCASE: getUserData → GETUSERDATA%{param:lower}
- Convert to lowercase: getUserData → getuserdata%{param:reverse}
- Reverse string: getUserData → ataDresUteg%{param:len}
- Get string length: getUserData → 11
Why %{}
? We chose this syntax to avoid conflicts with Rust’s native syntax:
- Doesn’t conflict with Rust 2024’s prefix identifier parsing (
#identifier
) - Visually distinct from standard Rust syntax
- Allows natural-looking templates that remain readable
- Supports complex expressions like
%{param[0]:snake}
for array indexing with transforms
§Supported Item Types
- Identifiers:
error
,warn
,info
- Strings:
"GET"
,"POST"
,"PUT"
- Numbers:
200
,404
,500
- Arrays:
["GET", 200]
,["POST", 201]
- Mixed:
[error, "GET", 200]
Macros§
- for_
each - Universal iteration macro supporting single items and arrays.