Skip to content

moleike/haskell-jsonnet

Repository files navigation

haskell-jsonnet

Actions Status Hackage

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).

Progress

Here is the implementation status of the main language features:

  • array and object comprehension
  • array slices
  • Python-style string formatting
  • text blocks
  • verbatim strings
  • computed field names
  • object-level locals
  • object-level asserts (by Berk Özkütük)
  • 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 and open recursion (operator + with self and super)
  • field composition (operator +:)
  • multiple file output (by Berk Özkütük)
  • verbatim imports (by Berk Özkütük)

Build

Using the stack build tool:

% git clone github.com/moleike/haskell-jsonnet.git
% cd haskell-jsonnet
% stack build

Install

% stack install # to install

Usage

% hs-jsonnet --help
Usage: hs-jsonnet [-v|--version] [-e|--exec] [<filename>]
                  [(-o|--output-file <filename>) | (-m|--multi <dir>)]
                  [--compact] [-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
  -m,--multi <dir>         Write multiple files to the directory, list files on
                           stdout
  --compact                Produce a compact JSON output
  -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

Output formats

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.

Benchmarks

Preliminary results using the benchmarks here for comparison.

Contributing

See CONTRIBUTING.md.

Acknowledgments

I took inspiration from Expresso, hnix, fixplate, Disco, and numerous other libraries. Thanks to their authors.

License

See LICENSE.

Copyright © 2020–present Alexandre Moreno