1 个不稳定版本
0.1.0 | 2021年2月20日 |
---|
#462 in 构建实用工具
25KB
398 行
constuneval
尝试使用Debug
特性将你的数据/tables序列化为const Rust代码。
为什么?
这个crate受这个GitHub问题的启发。
用法
此crate可用于你的构建脚本。它将尝试将你提供的数据/tables序列化到指定的任何文件中。之后,你可以使用include!将生成的代码嵌入到你的crate中。
有关完整文档,请参阅 - https://docs.rs/constuneval
致谢
许可证
MIT
lib.rs
:
专注于Cow
的简单序列化器,用于使用Debug特性生成const Rust代码。
用法
通常,要将某些代码(表格/struct)嵌入crate中,您必须使用构建脚本和include!
宏。在构建脚本中,您将使用constuneval
提供的[to_file()][to_file]或[to_string()][to_string]之一生成一些代码,然后包含生成的文件,如下所示
include!(concat!(env!(OUT_DIR), "/file_name.rs"));
此外,这个crate还提供了[UnevalCow]的一个分支,但通过Debug特性提供了更好的序列化
它是如何工作的?
为了使事情简单,所有的格式化/序列化都是通过Debug特性完成的。对于大多数类型,如struct
、enum
、Vec
等,它运行良好,但对于像Cow
这样的Deref类型,它们的Debug在格式化之前本质上会进行解引用。为了解决这个问题,此crate还提供了[UnevalCow]作为std::borrow::Cow的替代品。
当然,我们并不能总是直接构建出期望值的代码(更多内容请参考下面的限制部分)。
示例
use constuneval::{to_file, to_string, UnevalCow};
use std::fmt;
#[derive(Debug)]
pub struct FftDomain<F>
where
[F]: 'static + ToOwned + fmt::Debug,
<[F] as std::borrow::ToOwned>::Owned: fmt::Debug,
{
pub some_table: UnevalCow<'static, [UnevalCow<'static, [F]>]>,
}
// some build time generated struct table
let fft_temp = FftDomain {
some_table: UnevalCow::Owned(vec![
UnevalCow::Owned(vec![1, 2, 3, 4, 5]),
UnevalCow::Owned(vec![1, 2, 3, 4, 5]),
UnevalCow::Owned(vec![1, 2, 3, 4, 5]),
UnevalCow::Owned(vec![1, 2, 3, 4, 5]),
UnevalCow::Owned(vec![1, 2, 3, 4, 5]),
UnevalCow::Owned(vec![1, 2, 3, 4, 5]),
]),
};
to_file(
std::path::Path::new("const_fft_tables.rs"),
"FFT_TABLE",
&fft_temp,
Some("FftDomain<'static, i32>"),
)
.expect("Write Failed");
const_fft_tables.rs
的内容(在运行rustfmt后)
const FFT_TABLE: FftDomain<'static, i32> = FftDomain {
some_table: UnevalCow::Borrowed(&[
UnevalCow::Borrowed(&[1, 2, 3, 4, 5]),
UnevalCow::Borrowed(&[1, 2, 3, 4, 5]),
UnevalCow::Borrowed(&[1, 2, 3, 4, 5]),
UnevalCow::Borrowed(&[1, 2, 3, 4, 5]),
UnevalCow::Borrowed(&[1, 2, 3, 4, 5]),
UnevalCow::Borrowed(&[1, 2, 3, 4, 5]),
]),
};
现在,可以使用include!
宏将此文件/代码嵌入crate中。
限制
在某些情况下,constuneval
将无法生成有效的代码。具体来说
- 此序列化器旨在与实现了良好Debug特质的类型一起使用。如果Debug特质生成无效输出,则可能无法正常工作。