4 个稳定版本
1.1.1 | 2023 年 8 月 13 日 |
---|---|
1.0.1 | 2023 年 8 月 12 日 |
1073 在 编码
12KB
164 行
蔗糖
一个 Rust 包,用于在构建时将文件中的静态数据嵌入。
资源
蔗糖通过生成具有完全静态字段的现有结构的镜像来工作。
例如,这个结构
#[derive(sucrose::Resource)]
struct Character {
name: String
}
...会被转换成这样
struct Character {
name: &'static str
}
此外,动态实例也可以转换为它们的静态对应物。这
# struct Character { name: String };
Character {
name: String::from("Hello, world!"),
}
# ;
...变成这样
# struct Character { name: &'static str };
Character {
name: "Hello, world!",
}
# ;
转换看起来可能很微不足道,但您也可以嵌套资源(实现 Resource
的类型),并使用 ToStatic
特性为您自己的类型创建转换。
ToStatic
某些类型不一定必须是资源,但它们必须是资源的一部分。例如,考虑一个简单的整数类型:i32
。蔗糖需要知道如何将此类类型从动态表示形式转换为静态表示形式。在整数的情况下,这很简单:两种表示形式相同。
ToStatic
特性可用于表达一个类型可能是资源的一部分(实际上,#derive(Resource
还生成 ToStatic
的实现)。i32
的实现可能看起来像这样
# use sucrose::*;
impl ToStatic for i32 {
fn static_type() -> TokenStream {
quote!(i32)
}
fn static_value(&self) -> TokenStream {
quote!(#self)
}
}
此实现表示 i32
的静态等价物是,嗯,i32
,并且其值将以 Rust 中的普通整数文字形式编写(这正是 quote!(#self)
生成的)。
蔗糖为所有整数类型、String
、Vec
、bool
、Option
和 NonZero
整数类型提供了实现。根据需要,可能还会添加更多实现。
请注意,来自其他库的类型实现只能在sucrose或拥有该类型的库中编写。为了解决这个问题,您可以使用“newtype”包装器来使您的代码拥有该类型。作为更长期的解决方案,您可以提出一个请求实现该类型的issue。有关更多信息,请参阅Rust文档。
依赖项
~1.5–2.2MB
~43K SLoC