2 unstable releases
0.2.0 | Feb 13, 2024 |
---|---|
0.1.0 | Dec 7, 2023 |
#587 in Procedural macros
Used in rcss-bundler
22KB
420 lines
Simple helper to register macro handler and process their input from build.rs Currently supports only function-like macro.
Useful when your macro should output a file, but you want to avoid race conditions during incremental compilation and other routines.
Uses syn
to parse files and visit their macros.
Imagine you have some macro css
that implements scoping css technic.
It processes CSS syntax and returns css_class. But you also need to aggregate all css
!calls and save them into
style.css`
fn main() {
use rcss::css as my_css;
let css_class = my_css!{
.container {
background-color: black;
}
};
let html = format!(r#"<div class="{} my-class">Hello</div>"#, css_class);
let html = format!(r#"<link rel="stylesheet" href="style.css" />{}"#, html);
// output html.
}
In order to aggregate all CSS, you should open all src files, find if `css!`` was used and handle their input. You also should handle imports and renames.
The target of this crate is to deal with these problems.
In build.rs
fn main () {
let project_path = std::env!("CARGO_MANIFEST_DIR");
let crate_name = std::env::var("CARGO_CRATE_NAME").unwrap_or("rcss".to_owned());
let collect_style = RefCell::new(String::new());
let mut css_handler = |context, token_stream: TokenStream| {
collect_style.borrow_mut().push_str(/* Handle token_stream */ )
};
let mut visitor = Visitor::new();
let css_macro_path = vec![format!("{crate_name}::css")];
let css_macro = Rc::new(RefCell::new(MacroCall::new(&mut css_handler)));
visitor.add_macro(css_macro_path, css_macro);
visitor.visit_project(project_path);
let content = collect_style.into_inner();
// .. save content to a file
}
macro-visit
will find all occurrences of css!
macro, even if it was renamed.
Currently, it only looks for imports inside one file at a time and does not parallelize file processing.
Dependencies
~310–750KB
~18K SLoC