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 日 |
#702 在 Rust 模式
72 每月下载量
69KB
1.5K SLoC
将您的类型导出到其他语言,目前支持 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