3 releases
0.0.3 | Jun 28, 2024 |
---|---|
0.0.2 | Feb 9, 2024 |
0.0.1 | Dec 16, 2023 |
#1280 in Parser implementations
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
~209K SLoC