3 个版本

0.0.3 2024 年 6 月 28 日
0.0.2 2024 年 2 月 9 日
0.0.1 2023 年 12 月 16 日

#827解析器实现

每月 23 次下载

MIT 许可证

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