6个版本
0.1.5 | 2023年4月14日 |
---|---|
0.1.4 | 2023年3月19日 |
0.1.2 | 2023年2月26日 |
#220 in 值格式化
每月43次下载
24KB
480 行
defy
用更符合Rust风格、更友好的语法替换yew::html!
宏。
这个crate中使用的语法主要受到kotlinx.html和horrorshow的启发。
示例
use defy::defy;
struct Datum {
field: &'static str,
display: bool,
label: Label,
}
enum Label {
First(i32),
Second(u64),
}
let data = vec![
Datum { field: "foo", display: false, label: Label::First(1) },
Datum { field: "bar", display: true, label: Label::Second(2) },
];
let vnode = defy! {
h1 {
+ "Hello world";
}
ul {
for datum in data {
let field = datum.field;
if datum.display {
li(data-length = field.len().to_string()) {
+ field;
}
}
match datum.label {
Label::First(i) if i > 3 => {
h2 { +i; }
}
Label::Second(i) => {
h3 { +i; }
}
_ => { +"unmatched"; }
}
}
}
};
// Rendering code omitted
assert_eq!(
vnode_html.as_str().replace(['\n', ' '], ""),
r#"
<h1>Hello world</h1>
<ul>
unmatched
<li data-length="3">bar</li>
<h3>2</h3>
</ul>
"#
.replace(['\n', ' '], "")
);
为什么要发明另一种语法?
Yew已经提供了几个编辑器插件来帮助编辑器将html!
块作为HTML语法处理。然而,编辑器覆盖范围不完整,并且与常规Rust语法交互奇怪。defy
使用与常规Rust语法相似的语法(类似于ron的想法)并为如for循环等结构提供了更好的语法糖。
依赖关系
~275–730KB
~17K SLoC