Skip to content

Latest commit

History

History
163 lines (129 loc) 路 4.57 KB

README.md

File metadata and controls

163 lines (129 loc) 路 4.57 KB

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 (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 + with self and super)
  • field composition (operator +:)
  • multiple file output

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>] [-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

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鈥損resent Alexandre Moreno