| Crates.io | jslt |
| lib.rs | jslt |
| version | 0.0.5 |
| created_at | 2023-12-16 13:15:37.513196+00 |
| updated_at | 2025-06-07 11:42:23.324544+00 |
| description | Everyones favorite xslt but for json |
| homepage | |
| repository | https://github.com/DmitryDodzin/jslt.git |
| max_upload_size | |
| id | 1071726 |
| size | 169,675 |
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(())
}
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}
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.27 < 57 < 5 and .foo == "yes"Based on Quick reference
#![no_std] sooner than later for possible nodejs support ** with std cargo flag for regular use.