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 jsltNow 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§
Structs§
- Jslt
- Transformation