#serialization #serde #build-time #macro #no-std

no-std sucrose

Rust 包,用于在构建时将文件中的静态数据嵌入

4 个稳定版本

1.1.1 2023 年 8 月 13 日
1.0.1 2023 年 8 月 12 日

1073编码

MIT 许可证

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) 生成的)。

蔗糖为所有整数类型、StringVecboolOptionNonZero 整数类型提供了实现。根据需要,可能还会添加更多实现。

请注意,来自其他库的类型实现只能在sucrose或拥有该类型的库中编写。为了解决这个问题,您可以使用“newtype”包装器来使您的代码拥有该类型。作为更长期的解决方案,您可以提出一个请求实现该类型的issue。有关更多信息,请参阅Rust文档

依赖项

~1.5–2.2MB
~43K SLoC