试图创建自己的Serialize
特征和派生宏时,当我需要访问枚举的字段时,我被困住了.
例如,在枚举变量上:
enum MyEnum {
MyVariant(f32, u16, u16)
}
我想要做的是:
fn Serialize(self) -> Vec<u8> {
match self {
MyEnum::MyVariant(field0, field1, field2) => {
let mut result = Vec::<u8>::new();
result.append(&mut field0.Serialize());
result.append(&mut field1.Serialize());
result.append(&mut field1.Serialize());
result
}
}
}
其 idea 是,我将在基本数据类型上实现序列化特征,然后可以将其扩展到各种 struct 和枚举.
但我不知道如何为派生宏中的字段(field0、field1、field2)创建变量名,然后使用它们.
这就是我到目前为止要做的:
// create the fields argument tokens (this is "field0, field1, field2")
let mut fields_name = TokenStream2::new();
// operation of fields (this is result.append(field0.Serialize(); [...])
let mut fields_serialization = TokenStream2::new();
// counter to create numbered names for fields
let mut counter = 0;
for _field in &fields.unnamed { // fields is of type &FieldsUnnamed here
if counter == 0 {
fields_name.extend(quote!{
format!("field{}", #counter)
})
}
else {
fields_name.extend(quote!{
, format!("field{}", #counter)
})
}
fields_serialization.extend(quote_spanned! {variant.span()=>
result.append(&mut format!("field{}", #counter).Serialize());
});
counter += 1;
}
quote_spanned! {variant.span()=>
#name::#variant_name (#fields_name) => {
let mut result = Vec::new();
#fields_serialization
result
},
}
我知道,使用FORMAT宏时,我会得到一个字符串令牌,但它不起作用.但我不知道如何获取我所有的枚举变量字段并对其进行操作,因为我在网上找到的信息很少.