2个不稳定版本
0.1.0 | 2023年3月20日 |
---|---|
0.0.1 | 2021年4月2日 |
#88 in #reflection
568 个月下载量
在 5 个crate中使用 (通过 schema)
28KB
799 代码行数
schema -- Rust的通用模式推导
该crate在概念上非常简单:它公开了一个trait,Schema
,以及一个为该trait提供的 derive 宏。该trait只有一个方法,Schema::schema()
,该方法生成一个类型为 syn::DeriveInput
(该crate重新导出)的结构体,该结构体表示在 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. 这是用来做什么的?
是的。我不太确定。它似乎在开发或测试过程宏时可能很有用。它似乎也适用于可能编写过程宏但不愿处理为大量基本类型定义trait的情况。
2. 你为什么做这个?
公平。我在做一些与OpenAPI和JSON Schema相关的工作,并发现令人惊讶的是,我找不到一个通用的模式crate,比如提供了Java反射子集的crate。
我发现有人在crates.io上抢注了schema
这个名字。我想,“哈哈!我要给那个坏蛋一个教训!”于是我就给他发了邮件,他回应得很糟糕:“好吧,我发了一个邀请。”突然间,我就成了那个坏蛋。
几个月过去了,就像它们通常那样。
我有一个奇怪的想法,那就是一个 derive 宏可以解析一个项目,然后把这个结构从过程宏上下文瞬间传送到程序上下文。我通常需要一个实际的使用案例来推动一个项目,但这个似乎是一个很酷的技巧。这导致了这样的奇怪代码(即不是这个)
impl Teleporter for TokenStream {
fn teleport(&self) -> TokenStream {
quote! {
quote! {
#self
}
}
}
//...
}
我并不是很清楚这个crate是什么,或者它是否有用,但这是一个有趣的实验。如果你觉得它有用,或者你对它应该如何工作有不同想法,或者只是认为schema
应该是一个完全不同的crate:告诉我。
我在使用它并且...
请告诉我您用它做了什么... 您之前说...
4. ... 我在一些类型上看到了错误
请提交一个问题。也欢迎PR。
依赖项
~275–720KB
~17K SLoC