#reflection #macro #derivation #generic

dev schema

通过以下方式访问Rust项目的模式

3个不稳定版本

0.1.0 2023年3月20日
0.0.1 2021年4月2日
0.0.0 2018年9月20日

#212 in 进程宏

Download history 226/week @ 2024-03-14 274/week @ 2024-03-21 279/week @ 2024-03-28 200/week @ 2024-04-04 246/week @ 2024-04-11 300/week @ 2024-04-18 249/week @ 2024-04-25 354/week @ 2024-05-02 508/week @ 2024-05-09 428/week @ 2024-05-16 314/week @ 2024-05-23 188/week @ 2024-05-30 178/week @ 2024-06-06 124/week @ 2024-06-13 170/week @ 2024-06-20 75/week @ 2024-06-27

571 每月下载量
用于 4 crates

Apache-2.0

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