2个不稳定版本
0.2.0 | 2024年2月13日 |
---|---|
0.1.0 | 2023年12月7日 |
在过程宏中排名第587
22KB
420 行
简单的助手,用于在build.rs中注册宏处理程序并处理其输入。目前仅支持函数式宏。
当你的宏应该输出文件,但你又想避免增量编译和其他操作中的竞争条件时,非常有用。
使用syn
解析文件并访问它们的宏。
想象你有一些宏css
实现了作用域CSS技术。它处理CSS语法并返回css_class。但你还需要聚合所有css
!调用并保存到
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.
}
为了聚合所有CSS,你应该打开所有源文件,找到是否使用了`css!``,并处理它们的输入。你还应该处理导入和重命名。
这个crate的目标是处理这些问题。
在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
将找到所有css!
宏的出现,即使它已经被重命名。目前,它一次只查找一个文件中的导入,并且不会并行处理文件。
依赖项
~310–750KB
~18K SLoC