3 个版本
0.0.3 | 2024 年 6 月 28 日 |
---|---|
0.0.2 | 2024 年 2 月 9 日 |
0.0.1 | 2023 年 12 月 16 日 |
#827 在 解析器实现
每月 23 次下载
100KB
3K SLoC
JSLT
每个人的最爱 XSLT,但用于 JSON
Rust 版本的 Schibsted 的 jslt
use jslt::Jslt;
use serde_json::json;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let jslt: Jslt = r#"
{
"result" : {
for (.menu.popup.menuitem)
.value : .onclick
}
}
"#
.parse()?;
let input = json!({
"menu": {
"popup": {
"menuitem": [
{
"value": "Open",
"onclick": "OpenDoc()"
},
{
"value": "Close",
"onclick": "CloseDoc()"
}
]
}
}
});
let output = jslt.transform_value(&input)?;
assert_eq!(
output,
json!({
"result" : {
"Open" : "OpenDoc()",
"Close" : "CloseDoc()"
}
})
);
Ok(())
}
状态:POC
对选择器、常量和 for 循环有非常有限的支持,并无法保证当前阶段会继续进行。
快速支持参考
-
.
-
.<name>
-
.[<index>]
-
.[<from> : <to>]
-
if (<expr>) <expr> else <expr>
-
let <name> = <expr>
-
$<name>
-
[for (<expr>) <expr>]
-
{for (<expr>) <expr> : <expr>}
-
def<name>(<name>, <name>...) <expr>
-
//<任何一行末尾的内容>
-
{ <key> : <expr> }
-
{ <key> : <expr>, * : . }
-
5 * 7 + 23.2
-
7 < 5
-
7 < 5and.foo== "yes"
基于 快速参考
当前目标
- 创建函数注册的上下文和变量的作用域
- 尽早启用
#![no_std]
以支持可能的 Node.js 支持 *
* 使用带有 std
cargo 标志的常规使用。
依赖项
~8–11MB
~220K SLoC