Я использую структуру для построения схемы базы данных, поэтому мне нужна метаинформация структуры.
Предположим, моя структура схемы определена, как показано ниже:
#[derive(ParseStruct)]
pub struct User {
#[field_attr( unique = true, default = "", index=["@hash", "@count"] )]
pub name: String,
#[field_attr( unique = true, default = "" )]
pub username: String,
pub description: Option<String>,
pub age: u32
}
Я хочу для синтаксического анализа в следующую структуру:
pub struct Schema<T>{
name: String, // the struct name
origin: T, // the struct to be parse, like the User struct above.
fields: Vec<Field>, // the struct's fields
}
pub struct Field {
field_name: String,
field_type: String,
field_attrs: FieldAttribute
}
pub struct FieldAttribute {
unique: bool,
default: String,
index: Vec<String> // Index of the database
}
Я написал начало, но не знаю, как продолжить писать:
#[proc_macro_derive(ParseStruct)]
pub fn parse_struct_derive(input: TokenStream) -> TokenStream {
let ast = syn::parse(input).unwrap();
let name = &ast.ident;
let gen = quote! {
impl #name {
fn parsed_schema()-> Schema {
// return the parsed schema
//...
}
}
};
gen.into()
}
Ожидаемый результат:
use parse_struct::ParseStruct;
#[derive(ParseStruct)]
struct User{
#[field_attr( unique = true, default = "", index=["@hash", "@count"] )]
pub name: String
}
fn main() {
let schema = User::parsed_schema();
println!("{:#?}",schema);
}
Я не знаю, как это реализовать.
Я только недавно начал изучать макрос derive и еще не освоил его полностью. Трудно найти полезные руководства по макросу derive на Inte rnet.
Пожалуйста, помогите мне, спасибо.