Expand description
Simple Cow focussed serializer for generating const Rust code using Debug trait.
§Usage
In general, to embed some code(tables/struct) into crate, you have to use the build script
and include! macro. Inside the build script, you’ll generate
some code with one of the to_file(), to_string()
provided by constuneval,
and then include the generated file, like this:
include!(concat!(env!(OUT_DIR), "/file_name.rs"));Also this crate provides a fork of UnevalCow but with better serialization though Debug trait
§How does it work?
To keep things simple all the formatting/serialization is done with help
of Debug trait. For most types such as struct, enum, Vec, etc it
works fine, but not for Deref like types like Cow as their Debug essentially
deref before formatting. To address this crate also provides UnevalCow as a
substitute to std::borrow::Cow.
Of course, we can’t always directly construct the code for the desired value (more on this in the Limitations section below).
§Example
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");content of const_fft_tables.rs (after running rustfmt on it)
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]),
]),
};Now this file/code can be embed into crate using include! macro.
§Limitations
There are some cases when constuneval will be unable to generate valid code. Namely:
- This serializer is intended for use with types with well implemented Debug trait. It may not work if Debug trait is producing invalid outputs.
Re-exports§
pub use uneval_cow::UnevalCow;
Modules§
- uneval_
cow - Fork of std::borrow::UnevalCow with more proper Debug trait.