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
serde
is 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::Serialize
andserde::Deserialize
.