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
- keyword parameters
- default arguments
- top-level arguments
- 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
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鈥損resent Alexandre Moreno