#schema #reflection #macro #macro-derive

过程宏 schema-derive

为schema crate提供 derive 宏

2个不稳定版本

0.1.0 2023年3月20日
0.0.1 2021年4月2日

#88 in #reflection

Download history 327/week @ 2024-04-17 294/week @ 2024-04-24 327/week @ 2024-05-01 464/week @ 2024-05-08 393/week @ 2024-05-15 420/week @ 2024-05-22 191/week @ 2024-05-29 173/week @ 2024-06-05 121/week @ 2024-06-12 177/week @ 2024-06-19 117/week @ 2024-06-26 135/week @ 2024-07-03 122/week @ 2024-07-10 63/week @ 2024-07-17 246/week @ 2024-07-24 120/week @ 2024-07-31

568 个月下载量
5 个crate中使用 (通过 schema)

Apache-2.0

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