Expand description
Compile-time expression evaluation.
This crate is inspired by Zig’s comptime.
The passed closure will be evaluated at compile time.
§Example
println!(
"The program was compiled on {}.",
// note how chrono::Utc is transported
edg::r! { || -> chrono::DateTime<chrono::Utc> { chrono::Utc::now() } }.format("%Y-%m-%d").to_string()
); // The program was compiled on 2023-11-16.§Limitations
- Unlike Zig,
edg::r!does not have access to the scope in which it is invoked, as the closure inedg::r!is run as its own script. - Unfortunately, as
serdeis not const, you cant haveconst X: _ = edg::r! { .. }. - Each block must be compiled sequentially.
§How it works
edg::r!:
- adds serde_json::to_string to your code
- creates a file
edg-{hash}.rs, with your new code, in your target directory - compiles the file with
rustc - executes the file
- emits code to deserialize the json output.
§Predecessor
Much of the code is from the comptime crate.
Macros§
- r
- Run a closure at compile time.
This closure is completely isolated.
You may return any data structure that implements
serde::Serializeandserde::Deserialize.