| Crates.io | accessor-macro |
| lib.rs | accessor-macro |
| version | 0.2.1 |
| created_at | 2025-05-23 08:02:45.151795+00 |
| updated_at | 2025-09-10 09:10:18.560753+00 |
| description | This library provides a derive macro for generating accessor methods with optional value range checks in Rust structs |
| homepage | |
| repository | https://github.com/mengyou1024/accessor-macro.git |
| max_upload_size | |
| id | 1686014 |
| size | 91,848 |
accessor-macro 是一个 Rust 的派生宏(derive macro)库,用于自动生成结构体字段的 getter 和 setter 方法 该宏支持为字段生成简单的访问器方法,同时也支持在 setter 中添加范围检查逻辑,以确保设置的值在指定范围内
使用 #[derive(Accessor)] 宏来自动生成字段的 getter 和 setter 字段上使用 #[accessor(get, set)] 属性来标记需要生成 getter 和 setter 的字段
在 setter 方法中可以添加范围检查逻辑,当设置的值超出指定范围时,setter 返回 false 使用 range=[min, max] 来定义字段的取值范围
debug_panic: 在 debug 模式下非法赋值时触发 panic#[derive(Accessor)]在结构体定义前添加 #[derive(Accessor)] ,并在需要生成访问器和修改器的字段上添加 #[accessor] 属性。
use accessor_macro::Accessor;
use uintx::u24;
#[derive(Accessor, Debug)]
struct Person {
// 生成getter和setter
#[accessor(get, set)]
name: String,
// 生成getter和setter,同时添加范围检查
#[accessor(get, set, range=[0, 200])]
age: i32,
// 生成getter和setter,同时添加范围检查, 范围使用表达式生成
#[accessor(get, set, range=[u24::from(0), u24::from(100)])]
number: u24,
// 以结构体属性和方法作为范围检查条件
self_test_min: i32,
#[accessor(get, set, range=[self.self_test_min, self.get_test_max()])]
self_test: i32,
#[accessor(get(no_ref), set, range=[0, 100])]
no_ref: u24,
}
impl Person {
pub fn get_test_max(&self) -> i32 {
100
}
}
fn main() {
let mut person = Person {
name: "Alice".to_string(),
age: 25,
number: u24::from(50),
self_test_min: 0,
self_test: 50,
no_ref: u24::from(50),
};
println!("person: {:?}", person);
println!("--------------------------------------");
println!("设置age为-1, -1 不在范围, 返回false");
assert!(!person.set_age(-1));
println!("person: {:?}", person);
println!("--------------------------------------");
println!("设置age为18, 18 在范围, 返回true");
assert!(person.set_age(18));
println!("person: {:?}", person);
println!("--------------------------------------");
println!("设置number为0, 0 在范围, 返回true");
assert!(person.set_number(u24::from(0)));
println!("person: {:?}", person);
println!("--------------------------------------");
println!("设置number为101, 101 不在范围, 返回false");
assert!(!person.set_number(u24::from(101)));
println!("person: {:?}", person);
println!("--------------------------------------");
println!("设置self_test为-1, -1 不在范围, 返回false");
assert!(!person.set_self_test(-1));
println!("person:{:?}", person);
println!("--------------------------------------");
println!("动态修改self_test_min为-100");
person.self_test_min = -100;
println!("设置self_test为-1, -1 在范围, 返回true");
assert!(person.set_self_test(-1));
println!("persion:{:?}", person);
println!("--------------------------------------");
println!("no_ref");
person.self_test_min = -100;
assert_eq!(person.get_no_ref(), u24::from(50));
println!("--------------------------------------");
}
你可以使用以下命令运行示例代码:
cargo run --example basic_usage
这个项目是AI生成的,如果您有任何问题请咨询AI
如果您不幸联系了我,那么不好意思,我并没有能力做任何修改😊
当然如果能给该项目提交一个PR那就再好不过了👍
