9 个版本 (4 个重大变更)

0.5.0 2023 年 10 月 28 日
0.4.2 2023 年 10 月 13 日
0.3.0 2023 年 10 月 5 日
0.2.1 2023 年 10 月 5 日
0.1.1 2023 年 9 月 30 日

#702Rust 模式

Download history

72 每月下载量

MIT/Apache

69KB
1.5K SLoC

crates.io docs.rs

将您的类型导出到其他语言,目前支持 TypeScript。

此包主要针对与 serde 框架及其表示的兼容性。提供与 #[serde] 带注解宏属性兼容性,这些属性位于默认的 serde_compat 功能之后。

使用方法

准备您的类型

使用 Burr 带注解宏来装饰您的类型。

use burrtype::prelude::*;

#[derive(Burr)]
pub struct Foo(u64);

#[derive(Burr)]
pub struct Bar(Foo);

使用可选的 #[burr(mod)] 属性自动将您的类型分配给一个模块。在这里,如果导出时没有显式包含,则 Foo 将自动包含在指定的模块中。

use burrtype::prelude::*;

#[derive(Burr)]
#[burr(mod = "common/types")]
pub struct Foo(u64);

导出您的类型

在您的程序中的 main() 或(最好是)另一个二进制文件中,我们可以创建一个导出器并可选地配置它。导出器和其组件的行为类似于构建者模式。

Burrxporter::new()

使用模块添加您的类型以组织它们。此模块树通常转换为生成的文件结构 - 每个模块一个文件 - 但语言约束、功能或选项可能会改变这种行为。

    .with_mod(BurrMod::new("bar")
        .with_type::<Bar>()
    )

解决类型依赖关系,导出您的类型所依赖的类型。它们将被添加到类型选择的模块或给定的默认模块中。如果显式包含描述您的数据所需的所有类型,则此步骤是不必要的。

    .resolve_exports("common")

或者,您可以自动包含带有 #[burr(mod = "path")] 属性标记的 所有 类型。这可以绕过手动构建输出模块的需要。

    .resolve_all("common")

导出到一个或多个目标。

    // outputs ./ts/common.ts and ./ts/bar.ts
    .export("ts", TypeScript::new())?
    // bundles all exported types into a single file
    .export("out/bundled.ts", TypeScript::new().with_file_map(ModFileMap::Inline))?

示例中查看这些概念的实际应用。

第三方类型

对于不继承自Burr的类型,例如来自第三方crate的类型,可以使用属性将字段视为另一种类型。

#[derive(serde::Serialize, serde::Deserialize, Debug)]
pub struct PhantomType(pub u64);

#[derive(Burr)]
pub struct Foo {
    #[burr(type = u64)]
    pub foo: PhantomType,
}

或者,您可以将第三方类型注册为目标语言中代表该类型的字符串名称。

    .export("api", TypeScript::new()
        .with_type_name::<rust_decimal::Decimal>("number")
    )?

依赖项

~0.5–1MB
~20K SLoC