# JSLT
### Everyones favorite [XSLT](https://www.w3schools.com/xml/xsl_intro.asp) but for json
Rust port for Schibsted's [jslt](https://github.com/schibsted/jslt#jslt)
```rust
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
```bash
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*)
```bash
```
## 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:
- [x] `.`
- [x] `.<name>`
- [x] `.[<index>]`
- [x] `.[<from> : <to>]`
- [x] `if (<expr>) <expr> else <expr>`
- [x] `let <name> = <expr>`
- [x] `$<name>`
- [x] `[for (<expr>) <expr>]`
- [x] `{for (<expr>) <expr> : <expr>}`
- [x] `def <name>(<name>, <name>...) <expr> `
- [x] `// <anything up to end of line>`
- [x] `{ <key> : <expr> }`
- [x] `{ <key> : <expr>, * : . }`
- [x] `5 * 7 + 23.2`
- [x] `7 < 5`
- [x] `7 < 5 and .foo == "yes"`
Based on [Quick reference](https://github.com/schibsted/jslt#quick-references)
### Current Goals:
- [x] 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.