2 releases

0.0.2 Feb 9, 2024
0.0.1 Dec 16, 2023

#1158 in Parser implementations

30 downloads per month

MIT license

100KB
3K SLoC

JSLT

Everyones favorite XSLT but for json

Rust port for Schibsted's 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(())
}

Status: POC

There is very minial support for selectors, constants and for loops and no garantee this will continue any further in the current phase.

Quick support reference:

  • .
  • .<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>
  • // <anything up to end of line>
  • { <key> : <expr> }
  • { <key> : <expr>, * : . }
  • 5 * 7 + 23.2
  • 7 < 5
  • 7 < 5 and .foo == "yes"

Based on Quick reference

Current Goals:

  • Create context for function registration and scopes for variables
  • Enable #![no_std] sooner than later for possible nodejs support *

* with std cargo flag for regular use.

Dependencies

~8–11MB
~234K SLoC