#macro #field #wasm #meta #pinea

macro pinea-macro-tools

pinea的过程宏工具

1 个不稳定版本

0.1.0 2024年4月2日

#83 in #meta


用于 pinea

自定义许可证

21KB
509 代码行

宏工具

包含一些有用的宏工具;

字段

为字段创建读写方法

例如

为Meta创建读取字段;

    #[derive(Fields)]
    #[r]
    struct Meta {
        field_a: String,
        field_b: i32,
    }

    let meta = Meta {
        field_a: String::new(),
        field_b: 3,
    };

    let field_a: &String = meta.field_a();
    let field_b: i32 = meta.field_b();

为结构体创建公共的写入字段;

    #[derive(Fields)]
    #[w]
    struct Meta {
        field_a: String,
        field_b: i32,
    }

    let mut meta = Meta {
        field_a: String::new(),
        field_b: 3,
    };

    let field_a_mut: &mut String = meta.field_a_mut();
    let field_b_mut: &mut i32 = meta.field_b_mut();

使用reducer为结构体创建自定义写入字段:impl FnOnce(Type) -> Type

    #[derive(Fields)]
    #[r]
    struct Meta {
        #[w(reducer)]
        field_a: String,
        field_b: i32,
    }

    let mut meta = Meta {
        field_a: String::new(),
        field_b: 3,
    };

    let field_b = meta.field_b();

    meta.set_field_a(|field_a| field_a + &field_b.to_string());

使用set为结构体创建自定义写入字段;

    #[derive(Fields)]
    #[r]
    struct Meta {
        #[w(set)]
        field_a: String,
        field_b: i32,
    }

    let mut meta = Meta {
        field_a: String::new(),
        field_b: 3,
    };

    let field_b = meta.field_b();

    meta.set_field_a(meta.field_a().clone() + &field_b.to_string());

字段的可视性

如果结构体定义为pub,则所有字段方法将定义为pub

如果结构体定义为private,则所有字段方法将定义为private

或为字段方法自定义vis

mod private {
    use picea_macro_tools::Fields;

    #[derive(Fields)]
    #[r]
    pub struct Meta {
        #[w(set, vis(pub(self)))]
        field_a: String,
        field_b: i32,
    }
}

/// follow code will not compile
let mut meta = private::Meta::new();

meta.set_field_a(""); // function `set_field_a` is private

依赖

~300–760KB
~18K SLoC