Crate jslt

Source
Expand description

§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(())
}

§Cli

cargo install --features binary jslt

# Optional to install with http client with (ureq/curl)
cargo install --features binary --features clio/http-ureq jslt
# or 
cargo install --features binary --features clio/http-curl jslt

Now you have jslt binary and can it for simple cli transformations (jslt --help for more cli docs)

echo '{"foo": "bar"}' | jslt -s '{ "foo_" + .foo : 2000 }'
# {"foo_bar":2000}

§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.

Modules§

context
error
format
parser
transform

Structs§

Jslt
Transformation