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`](https://crates.io/crates/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` ```rust fn main() { use rcss::css as my_css; let css_class = my_css!{ .container { background-color: black; } }; let html = format!(r#"
Hello
"#, css_class); let html = format!(r#"{}"#, 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 ```rust 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.