Nickel

Continuous integration

Nickel is the cheap configuration language.

Its purpose is to automate the generation of static configuration files - think JSON, YAML, XML, or your favorite data representation language - that are then fed to another system. It is designed to have a simple, well-understood core: it is in essence JSON with functions.

Nickel's salient traits are:

The motto guiding Nickel's design is:

Great defaults, design for extensibility

There should be a standard, clear path for common things. There should be no arbitrary restrictions that limit what you can do you the one day you need to go beyond.

Use cases

Nickel is a good fit in any situation where you need to generate a complex configuration, be it for a single app, a machine, whole infrastructure, or a build system.

The motivating use cases are in particular: - The Nix package manager: Nix is a declarative package manager using its own language for specifying packages. Nickel is an evolution of the Nix language, while trying to overcome some of its limitations. - Infrastructure as code: infrastructure is becoming increasingly complex, requiring a rigorous approach to deployment, modification and configuration. This is where a declarative approach also shines, as adopted by Terraform, NixOps or Kubernetes, all requiring potentially complex generation of configuration. - Build systems: build systems (like Bazel) need a specification of the dependency graph.

Most aforementioned projects have their own bespoke configuration language. See Related projects and inspirations. In general, application-specific languages might suffer from feature creep, lack of abstractions or just feel ad hoc. Nickel buys you more for less.

Getting started

Run

  1. Start Nickel

  2. Run your first program: console $ ./nickel <<< 'let x = 2 in x + x' 4 Or load it from a file: console $ echo 'let s = "world" in "Hello, " ++ s' > program.ncl $ ./nickel -f program.ncl "Hello, world"

  3. Start a REPL: ```console $ ./nickel repl nickel> let x = 2 in x + x 4

    nickel> `` Use:help` for a list of available commands.

  4. Export your configuration to JSON, YAML or TOML: console $ ./nickel export --format json <<< '{foo = "Hello, world!"}' { "foo": "Hello, world!" }

Use nickel help for a list of subcommands, and nickel help <subcommand> for help about a specific subcommand.

Editor Setup

Nickel has syntax highlighting plugins for Vim/Neovim, and VSCode. In-editor diagnostics, type hints, and auto-completion are provided by the Nickel Language Server. Please follow this guide to setup syntax highlighting and NLS.

Build

  1. Download build dependencies:
  2. Build Nickel: console $ cargo build And voilĂ ! Generated files are placed in target/debug.
  3. (optional) make a symbolic link to the executable: console $ ln -S nickel target/debug/nickel

Tests

console $ cargo test

Documentation

  1. Build the doc: console $ cargo doc --no-deps
  2. Open the file target/doc/nickel/index.html in your browser.

Examples

You can find examples in the ./examples directory.

Current state and roadmap

Nickel has been released in version 0.1. This version should be functional, it is intended to gather feedback and real-life testing. Nickel 0.1 isn't intended to be used in production. The next steps we plan to work on are:

Related projects and inspirations

See RATIONALE.md for the design rationale and a more detailed comparison with a selection of these languages.