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