rust - 如何使用派生宏解析结构的元信息?

pan*_*ive 1 macros struct rust

我正在使用结构体来构建数据库的模式,所以我需要结构体的元信息。

\n

假设我的架构结构定义如下:

\n
#[derive(ParseStruct)]\npub struct User {\n\n  #[field_attr( unique = true, default = "", index=["@hash", "@count"] )]\n  pub name: String,\n\n  #[field_attr( unique = true, default = "" )]\n  pub username: String,\n\n  pub description: Option<String>,\n  pub age: u32\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我想解析为以下结构:

\n
pub struct Schema<T>{\n  name: String,         // the struct name\n  origin: T,            // the struct to be parse, like the User struct above.\n  fields: Vec<Field>,   // the struct\'s fields\n}\n\npub struct Field {\n    field_name: String,\n    field_type: String,\n    field_attrs: FieldAttribute\n}\n\npub struct FieldAttribute {\n    unique: bool,\n    default: String,\n    index: Vec<String>   // Index of the database\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我写了一个开头,但我不知道如何继续写:

\n
#[derive(ParseStruct)]\npub struct User {\n\n  #[field_attr( unique = true, default = "", index=["@hash", "@count"] )]\n  pub name: String,\n\n  #[field_attr( unique = true, default = "" )]\n  pub username: String,\n\n  pub description: Option<String>,\n  pub age: u32\n}\n
Run Code Online (Sandbox Code Playgroud)\n

预期结果:

\n
pub struct Schema<T>{\n  name: String,         // the struct name\n  origin: T,            // the struct to be parse, like the User struct above.\n  fields: Vec<Field>,   // the struct\'s fields\n}\n\npub struct Field {\n    field_name: String,\n    field_type: String,\n    field_attrs: FieldAttribute\n}\n\npub struct FieldAttribute {\n    unique: bool,\n    default: String,\n    index: Vec<String>   // Index of the database\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我不知道如何实现它。

\n

我最近才开始学习derive宏,还没有完全掌握。在互联网上很难找到有关派生宏的有用教程。

\n

请帮助我,谢谢。

\n

pyl*_*int 5

使用 proc_macro_derive(过程宏)

src/main.rs:

use print_struct_trait::PrintStruct;

#[derive(PrintStruct)]
struct Point {
    name: String,
    x: i32,
    y: i32,
}

fn main() {
    let point = Point {
        name: "origin".to_string(),
        x: 2,
        y: 3,
    };
    point.print();
}
Run Code Online (Sandbox Code Playgroud)

输出:

key=name, value=origin, type=String
key=x, value=2, type=i32
key=y, value=3, type=i32
Run Code Online (Sandbox Code Playgroud)

print_struct_derive/src/lib.rs:

key=name, value=origin, type=String
key=x, value=2, type=i32
key=y, value=3, type=i32
Run Code Online (Sandbox Code Playgroud)

PrintStruct 的github上的源代码

参考: