#proc-macro #utility #attributes #macro #type #omit #partial

utility-types

此软件包使用过程宏在 Rust 中实现 TypeScript 的几个实用类型。

4 个版本

0.0.4 2024 年 7 月 30 日
0.0.3 2024 年 6 月 16 日
0.0.2 2021 年 11 月 26 日
0.0.1 2021 年 11 月 26 日

开发工具 中排名第 489

Download history 6/week @ 2024-05-16 3/week @ 2024-05-23 3/week @ 2024-05-30 174/week @ 2024-06-13 38/week @ 2024-06-20 151/week @ 2024-06-27 225/week @ 2024-07-04 223/week @ 2024-07-11 341/week @ 2024-07-18 615/week @ 2024-07-25 638/week @ 2024-08-01 630/week @ 2024-08-08 712/week @ 2024-08-15

每月下载量 2,660

MIT 许可证

46KB
828 行(不包括注释)

实用类型

此软件包使用过程宏在 Rust 中实现 TypeScript 的几个实用类型。

Typescript 实用类型
[Partial] Partial<Type>
[Pick] Pick<Type, Keys>
[Omit] Omit<Type, Keys>
[Extract] Extract<Type, Union>
[Exclude] Exclude<UnionType, ExcludedMembers>

示例

以下是如何使用此软件包的示例。

use utility_types::{Omit, Partial, Pick, Required};
#[derive(Clone, Partial, Required, Pick, Omit)]
#[partial(ident = PartialFoo, derive(Debug, PartialEq), forward_attrs())]
#[required(ident = RequiredFoo, derive(Debug, PartialEq), forward_attrs())]
#[pick(arg(ident = PickAB, fields(a, b), derive(Debug, PartialEq)), forward_attrs())]
#[omit(arg(ident = OmitCD, fields(c, d), derive(Debug, PartialEq)), forward_attrs())]
pub struct Foo {
    a: u8,
    b: Option<u8>,
    c: Option<Vec<u8>>,
}

上述代码将生成以下代码。

#[derive(Debug, PartialEq)]
pub struct PartialFoo {
    a: Option<u8>,
    b: Option<Option<u8>>,
    c: Option<Option<Vec<u8>>>,
}
#[derive(Debug, PartialEq)]
pub struct RequiredFoo {
    a: u8,
    b: u8,
    c: Vec<u8>,
}
#[derive(Debug, PartialEq)]
pub struct PickAB {
    a: u8,
    b: Option<u8>,
}
#[derive(Debug, PartialEq)]
pub struct OmitCD {
    a: u8,
    b: Option<u8>,
}

还生成了一些有用的特质。

  • From<Foo>PartialFooPickABOmitCD
  • From<PartialFoo>Foo

转发属性

要与其他需要属性的软件包一起使用此软件包,可以使用 forward_attrs 属性来控制将哪些属性转发到生成的结构体或枚举。

use serde::{Deserialize, Serialize};
use utility_types::Omit;

#[derive(Debug, PartialEq, Serialize, Deserialize, Omit)]
#[omit(
    arg(
        ident = OmitCD,
        fields(c, d),
        derive(Debug, PartialEq, Serialize, Deserialize),
        forward_attrs(serde)
    )
)]
#[serde(rename_all = "UPPERCASE")]
pub struct Foo {
    a: u8,
    b: Option<u8>,
    c: Option<Vec<u8>>,
}

let omit_cd: OmitCD = serde_json::from_str(r#"{"A": 1, "B": 2}"#).unwrap();
assert_eq!(omit_cd, OmitCD { a: 1, b: Some(2) });

forward_attrs 属性的行为如下

  • 如果 未提供,则默认转发所有属性。
  • 如果提供了一组属性列表,则仅转发指定的属性。
    • 例如,forward_attrs(doc, serde) 将仅转发 docserde
    • 如果提供 * (forward_attrs(*)),则转发所有属性。
    • 如果提供的是一个空列表(forward_attrs()),则不会转发任何属性。
  • 如果提供一个列表作为 not() 的参数,则除了指定的属性外,其他所有属性都会被转发。
    • 例如,forward_attrs(not(serde)) 将转发除了 serde 之外的所有属性。

已知问题

目前我没有分析生成的结构体或枚举中使用了哪个泛型。因此,如果泛型字段未包含在生成的结构体或枚举中,rustc 将会报错。

依赖项

~0.6–1MB
~24K SLoC