3个不稳定版本
0.1.0 | 2023年3月20日 |
---|---|
0.0.1 | 2021年4月2日 |
0.0.0 | 2018年9月20日 |
#212 in 进程宏
571 每月下载量
用于 4 crates
10KB
91 行
schema -- Rust的通用模式推导
该库在概念上非常简单:它公开了一个trait,Schema
,以及一个用于该trait的derive宏。这个trait只有一个方法,Schema::schema()
,它生成一个类型为syn::DeriveInput
(该库重新导出)的结构体,代表调用schema()
的类型模式。
#[derive(Schema)]
struct MyType {
a: u32,
}
如果我们执行println!("{:#?}", MyType::schema())
,我们得到
DeriveInput {
attrs: [],
vis: Inherited,
ident: Ident(
MyType,
),
generics: Generics {
lt_token: None,
params: [],
gt_token: None,
where_clause: None,
},
data: Struct(
DataStruct {
struct_token: Struct,
fields: Named(
FieldsNamed {
brace_token: Brace,
named: [
Field {
attrs: [],
vis: Inherited,
ident: Some(
Ident(
a,
),
),
colon_token: Some(
Colon,
),
ty: Path(
TypePath {
qself: None,
path: Path {
leading_colon: None,
segments: [
PathSegment {
ident: Ident(
u32,
),
arguments: None,
},
],
},
},
),
},
],
},
),
semi_token: None,
},
),
}
常见问题解答
1. 这是什么用呢?
是的。我并不是100%确定。它似乎在开发或测试进程宏时可能很有用。它似乎也适用于可能编写进程宏但不想费心为一些基本类型定义trait的情况。
2. 你为什么制作这个?
公平。我在做OpenAPI和JSON Schema的工作时,发现很难找到一个通用的模式crate,比如提供了Java反射子集的东西。
我在crates.io上发现有人霸占了schema
这个名字。我想,“哈哈!”我想,“我要给那个坏蛋一点教训!”于是我给他发了邮件,他以最糟糕的方式回应:“好吧,我发了个邀请。”突然间,我就成了那个坏蛋。
几个月就这样过去了。
我有个奇怪的想法,就是编写一个derive宏,它会解析一个项目,然后将这个结构体从进程宏上下文传输到程序上下文。我通常需要一个实际用例来推动项目,但这个似乎是个很酷的技巧。它导致了这样的奇怪代码(即不是这样的代码)
impl Teleporter for TokenStream {
fn teleport(&self) -> TokenStream {
quote! {
quote! {
#self
}
}
}
//...
}
我并不确定这个包是什么,也不知道它是否有用,但它是一次有趣的实验。如果你觉得它有用,或者有关于它应该如何工作的不同想法,或者只是认为 schema
应该是一个完全不同的包:请告诉我。
3. 我正在使用它并且...
请告诉我你用它做了什么...你刚才说的...
4. ...我在某些类型上看到了错误
请提交一个问题。也欢迎提交PR。
依赖
~300–760KB
~18K SLoC