2 releases
0.0.2 | May 18, 2021 |
---|---|
0.0.1 | May 17, 2021 |
#1734 in Procedural macros
25 downloads per month
10KB
109 lines
ctjs
Execute JavaScript at compile time to generate Rust code. Both evaluating expressions and custom derives are supported.
eval
use ctjs::eval;
const X: f64 = eval! {
// This is JavaScript
const x = 5;
String(x * Math.PI)
};
assert!(X > 15.0);
assert!(X < 16.0);
Custom Derive
use ctjs::JsMacro;
#[derive(Debug, JsMacro)]
#[js_macro = "fruit_derive"]
enum Fruit {
#[js(name = "granny smith")]
Apple,
Orange,
Pear,
}
fruit_derive! {
js!(
let output = "const _: () = {\n";
output += "use std::fmt::{self, Write};\n";
// name is "Fruit"
output += "impl fmt::Display for " + name + "{\n";
output += "fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n";
output += "write!(f, \"{}\", match self {\n";
// ident is "Apple" or "Orange" or "Pear"
for (const { ident, attrs } of item.variants) {
let string = '"' + ident.toLowerCase() + '"';
const kv = ctjs.parse_attrs(attrs);
if (kv.name) {
string = kv.name;
}
output += "Self::" + ident + " => " + string + ",\n";
}
output += "})\n";
output += "}\n}\n};\n";
output
)
}
let fruits = vec![Fruit::Apple, Fruit::Orange, Fruit::Pear];
for fruit in &fruits {
println!("Debug: {:?}, Display: {}", fruit, fruit);
}
assert_eq!(&fruits[0].to_string(), "granny smith");
assert_eq!(&fruits[1].to_string(), "orange");
assert_eq!(&fruits[2].to_string(), "pear");
Current version: 0.0.1
Prior Work
All code licensed as MIT
Dependencies
~4.5MB
~117K SLoC