jsonnet: Jsonnet implementaton in pure Haskell

[ bsd3, compiler, library, program ] [ Propose Tags ]
Versions [RSS] 0.1.0.0, 0.2.0.0, 0.3.0.0, 0.3.0.1, 0.3.1.1 (info)
Change log CHANGELOG.md
Dependencies aeson (>=1.5.6 && <1.6), ansi-wl-pprint (>=0.6.9 && <0.7), base (>=4.15.0 && <4.16), bytestring (>=0.10.12 && <0.11), containers (>=0.6.4 && <0.7), data-fix (>=0.3.1 && <0.4), deriving-compat (>=0.5.10 && <0.6), directory (>=1.3.6 && <1.4), exceptions (>=0.10.4 && <0.11), filepath (>=1.4.2 && <1.5), hashable (>=1.3.1 && <1.4), jsonnet, megaparsec (>=9.0.1 && <9.1), mtl (>=2.2.2 && <2.3), optparse-applicative (>=0.16.1 && <0.17), parser-combinators (>=1.3.0 && <1.4), scientific (>=0.3.6 && <0.4), semigroupoids (>=5.3.5 && <5.4), template-haskell (>=2.17.0 && <2.18), text (>=1.2.4 && <1.3), transformers-compat (>=0.6.6 && <0.7), unbound-generics (>=0.4.1 && <0.5), unordered-containers (>=0.2.13 && <0.3), vector (>=0.12.2 && <0.13) [details]
License BSD-3-Clause
Copyright 2020 Alexandre Moreno
Author Alexandre Moreno
Maintainer alexmorenocano@gmail.com
Category Compiler
Home page https://github.com/moleike/haskell-jsonnet#readme
Bug tracker https://github.com/moleike/haskell-jsonnet/issues
Source repo head: git clone https://github.com/moleike/haskell-jsonnet
Uploaded by moleike at 2021-03-25T08:14:46Z
Distributions
Executables hs-jsonnet
Downloads 687 total (16 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for jsonnet-0.2.0.0

[back to package description]

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

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]

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

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.

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
  • object-level locals
  • object-level asserts
  • keyword parameters
  • default arguments
  • top-level arguments
  • external variables
  • hidden fields (@CristhianMotoche)
  • tailstrict annotation

OO features are implemented but need some more work:

  • self keyword
  • super keyword
  • outermost object reference $
  • object composition (merging objects)
  • field composition (+: field syntax)

Benchmarks

Preliminary results using the benchmarks here for comparison.

Contributing

See CONTRIBUTING.md.

Acknowledgments

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

License

See LICENSE.

Copyright © 2020–present Alexandre Moreno