#debugging #traits #const #serialization #embed #documentation #uneval-cow

build constuneval

简单的序列化器,使用Debug特性将struct/tables嵌入const Rust代码

1 个不稳定版本

0.1.0 2021年2月20日

#462 in 构建实用工具

MIT 许可证

25KB
398

constuneval

尝试使用Debug特性将你的数据/tables序列化为const Rust代码。

为什么?

这个crate受这个GitHub问题的启发。

用法

此crate可用于你的构建脚本。它将尝试将你提供的数据/tables序列化到指定的任何文件中。之后,你可以使用include!将生成的代码嵌入到你的crate中。

有关完整文档,请参阅 - https://docs.rs/constuneval

致谢

uneval@burdges

许可证

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特性完成的。对于大多数类型,如structenumVec等,它运行良好,但对于像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将无法生成有效的代码。具体来说

  1. 此序列化器旨在与实现了良好Debug特质的类型一起使用。如果Debug特质生成无效输出,则可能无法正常工作。

无运行时依赖