A full-fledged Haskell implementation of the Jsonnet spec. For an introduction to the language itself, see the tutorial or language reference. We are using the same test suite used in the offical C++ and Go implementation (which is fairly comprehensive).
Here is the implementation status of the main language features:
- array and object comprehension (but see #46)
- array slices
- Python-style string formatting
- text blocks
- verbatim strings
- object-level locals
- object-level asserts (#39)
- keyword parameters
- default arguments
- top-level arguments (#24)
- external variables (by Berk Özkütük)
- hidden fields (by Cristhian Motoche)
- tailstrict annotation
- outermost object reference
$
- mixin inheritence (operator
+
withself
andsuper
) - field composition (operator
+:
) - multiple file output (#32)
- verbatim imports (#52 and #58)
Using the stack build tool:
% git clone github.com/moleike/haskell-jsonnet.git
% cd haskell-jsonnet
% stack build
% stack install # to install
% hs-jsonnet --help
Usage: hs-jsonnet [-v|--version] [-e|--exec] [<filename>]
[-o|--output-file <filename>] [-S|--string]
[-V|--ext-str VAR=VALUE] [--ext-str-file FILE]
[--ext-code VAR=EXPR] [--ext-code-file FILE]
Available options:
-v,--version Print version of the program
-h,--help Show this help text
-e,--exec Treat filename as code
<filename> Jsonnet source file or stdin
-o,--output-file <filename>
Write to the output file rather than stdout
-S,--string Expect a string, manifest as plain text
-V,--ext-str VAR=VALUE External string variable
--ext-str-file FILE External string variable as file
--ext-code VAR=EXPR External code variable
--ext-code-file FILE External code variable as file
By default Jsonnet programs evaluate to a JSON document, serialized using aeson
.
The std
library provides several methods to output other formats, e.g.
to generate a Yaml stream instead:
% hs-jsonnet -S -e "std.manifestYamlStream(['a', 1, []])"
---
"a"
---
1
---
[]
...
Note the we need to use the option -S
to output a verbatim string, instead of default JSON.
Similarly, to output prettified JSON:
% cat pretty.jsonnet
std.manifestJsonEx(
{
x: [1, 2, 3, true, false, null,
"string\nstring"],
y: { a: 1, b: 2, c: [1, 2] },
}, " ")
% hs-jsonnet -S pretty.jsonnet
{
"x": [
1,
2,
3,
true,
false,
null,
"string\nstring"
],
"y": {
"a": 1,
"b": 2,
"c": [
1,
2
]
}
}
See the Standard library documentation for more details.
Preliminary results using the benchmarks here for comparison.
See CONTRIBUTING.md.
I took inspiration from Expresso, hnix, fixplate, Disco, and numerous other libraries. Thanks to their authors.
See LICENSE.
Copyright © 2020–present Alexandre Moreno