- toml
validator = { version="0.13", features = ["derive"] }
serde={version="1",features=["derive"]}
serde_json="1"
main.rs
#[macro_use]
extern crate serde;
macro_rules! generate_modal {
($name:ident,$(($variant:ident:$typ:ty $(,#[$attr:meta])*)), *)=>{
#[derive(Debug,Deserialize,Serialize,::std::default::Default)]
pub struct $name{
$(
$(#[$attr])*
$variant:$typ,
)*
}
};
}
generate_modal(Modal,(name:String));
fn main(){
let modal = Modal::default();
}
上面的宏没有加入 validator::Validate macro,能正常生成代码并且能正常编译运行,修改宏
macro_rules! generate_modal {
($name:ident,$(($variant:ident:$typ:ty $(,#[$attr:meta])*)), *)=>{
#[derive(Debug,Deserialize,Serialize,::validator::Validate,::std::default::Default)]
pub struct $name{
$(
$(#[$attr])*
$variant: $typ,
)*
}
};
}
//新增了::validator::Validate,编译报错: Type `Option < String >` of field `name` not supported
validator: github 地址(https://github.com/Keats/validator)
1
共 4 条评论, 1 页
评论区
写评论老哥,受教了。非常感谢!!
--
👇
modraedlau: 在解决这个问题前,我们来看下
dtolnay
的rust-quiz
第9题:https://dtolnay.github.io/rust-quiz/9我稍微机翻了部分作者的答案:
$:block
$:expr
$:item
$:literal
$:meta
$:pat
$:path
$:stmt
$:ty
$:ident
$:lifetime
$:tt
看了这道题后再回到这个问题可以知道,首先我们有
generate_modal!
宏,它中间又包裹了derive
宏,那么加上Validate
的derive
宏报错说类型不正确,由此可以大胆推断很可能是这个类型未被Validate
的derive
宏识别,也就是没有透明传递!原因就是因为使用了$:ty
来标识类型,而这个在后续的derive
宏中是不透明的。那么如何解决也非常简单了,将
$:ty
改成$:tt
便可:在解决这个问题前,我们来看下
dtolnay
的rust-quiz
第9题:https://dtolnay.github.io/rust-quiz/9我稍微机翻了部分作者的答案:
$:block
$:expr
$:item
$:literal
$:meta
$:pat
$:path
$:stmt
$:ty
$:ident
$:lifetime
$:tt
看了这道题后再回到这个问题可以知道,首先我们有
generate_modal!
宏,它中间又包裹了derive
宏,那么加上Validate
的derive
宏报错说类型不正确,由此可以大胆推断很可能是这个类型未被Validate
的derive
宏识别,也就是没有透明传递!原因就是因为使用了$:ty
来标识类型,而这个在后续的derive
宏中是不透明的。那么如何解决也非常简单了,将
$:ty
改成$:tt
便可:谢谢,我去提一个issue
--
👇
uno: 是validator derive的一个bug
是validator derive的一个bug