difftreelog
docs refactor README.md
in: master
2 files changed
README.mddiffbeforeafterboth1# jrsonnet1# jrsonnet22343## What is it5## What is it465[Jsonnet](https://jsonnet.org/) is a json templating language7[Jsonnet](https://jsonnet.org/) is a data templating language687This crate implements both jsonnet library, and alternative jsonnet executable9This Rust crate implements both jsonnet library and an alternative `jsonnet` executable based on it. For more information see [bindings](#Bindings).8109## Why11## Why?101211There is already 3 implementations of this standard: in [C++](https://github.com/google/jsonnet), in [Go](https://github.com/google/go-jsonnet/) and in [Scala](https://github.com/databricks/sjsonnet)13There already are multiple implementations of this standard implemented in different languages: [C++](https://github.com/google/jsonnet), [Go](https://github.com/google/go-jsonnet/), [Scala](https://github.com/databricks/sjsonnet).121413It is fun to write one in Rust :D15This implementation shows performance better than all existing implementations. For more information see [benchmarks](#Benchmarks).141615## Spec support17In the end, it's always fun to implement something in Rust.161817- Can pass all of original `examples` tests19## Compliance with the [specification](https://jsonnet.org/ref/spec.html)18- Can pass all of original `test_suite` tests, expect those, which checks golden output for stacktraces (vanilla-like stacktraces are implemented, but look is not 100% identical): 192021- Passes all the original `examples` tests2223- Passes all the original `test_suite` tests except for those which require stacktraces identical to the default implementation (while also being available, vanilla-like stacktraces are not 100% identical):2425 ```jsonnet26 ## Explaining format27 ```28 RuntimeError("3")29 --> /home/lach/jsonnet-rs/a.jsonnet:1:2530 |31 1 | local a = "%0 10.20d" % error "3";32 | ^^^^^^^^^ error statement33 |34 --> /home/lach/jsonnet-rs/a.jsonnet:1:1135 |36 1 | local a = "%0 10.20d" % error "3";37 | ^^^^^^^^^^^^^^^^^^^^^^^ function <mod> call38 |39 --> /home/lach/jsonnet-rs/a.jsonnet:6:640 |41 6 | a: a,42 | ^ variable <a>43 |44 --> /home/lach/jsonnet-rs/a.jsonnet:3:645 |46 3 | b: self.a,47 | ^^^^^^ field access48 |49 --> /home/lach/jsonnet-rs/a.jsonnet:9:150 |51 9 | e.b52 | ^^^ field access53 |54 ```5556 ## Compact format (default)57 ```58 RuntimeError("3")59 /home/lach/jsonnet-rs/a.jsonnet:1:25-35: error statement60 /home/lach/jsonnet-rs/a.jsonnet:6:6-8 : variable <a>61 /home/lach/jsonnet-rs/a.jsonnet:3:6-13 : field access62 /home/lach/jsonnet-rs/a.jsonnet:9:1-5 : field access63 ```6465 ## Vanilla format66 ```67 RUNTIME ERROR: 368 a.jsonnet:1:25-34 thunk <a> from <$>69 <std>:237:21-22 thunk from <function <anonymous>>70 <std>:754:20-24 thunk from <function <anonymous>>71 <std>:32:25-26 thunk from <function <anonymous>>72 <std>:32:16-27 function <anonymous>73 <std>:754:8-25 function <anonymous>74 <std>:237:7-23 function <anonymous>7576 a.jsonnet:6:6-7 object <d>77 a.jsonnet:3:6-12 object <c>78 a.jsonnet:9:1-4 $79 During evaluation80 ```81 ```8220## Bindings83## Bindings8485Jrsonnet provides a standard `libjsonnet.so` shared library and should work as drop-in replacement for it8687WASM bingings are also available, Java bindings (Both JNI and WASM compiled to .class) are in progress218822Jrsonnet implements standard `libjsonnet.so` shared library, and should work as drop-in replacement for it89See [bindings](./bindings/) for more information.239024WASM bindings are also available, Java bindings (Both JNI and WASM to .class compiled) are in progress91## Benchmarks259226See `./bindings/`93This is the fastest implementation of jsonnet both according to official benchmarks and real-life cluster configuration templating speed.279428## Benchmark95Official benchmark results are available [in this gist](https://gist.github.com/CertainLach/5770d7ad4836066f8e0bd91e823e451b) which may get updated sometimes. It shows tests against Golang, C++ and Scala implementations showing the best performance in most cases.299630This is fastest implementation of jsonnet, according to both official benchmarks97You can generate this report via31and mine cluster configuration templating speed329899```bash33Official benchmark report are available [in this gist](https://gist.github.com/CertainLach/5770d7ad4836066f8e0bd91e823e451b), and updated sometimes. Here it tested against golang, C++, and scala impl. As you can see, it is a lot faster100$ make benchmarks101```3410235TODO: Create docker container for easier benchmarking and/or benchmark in CI103 However it may not work until you link golang jsonnet implementation to `gojsonnet` and C++ implementation to `jsonnet`.3610437Also, there is some ideas to improve performance even further, by i.e:105## TO-DO list3810639- Mutating strings/arrays/objects instead of cloning on some operations (I.e concat), it should be possible by checking strong reference count, and mutating if there is only one reference107- [ ] Create docker container for easier benchmarking and/or benchmark in CI108- [ ] Implement and utilize mutable strings, arrays and objects instead of COWing when possible40109traces.pngdiffbeforeafterbothbinary blob — no preview