Home Explore Blog Models CI



nixpkgs

doc/functions/generators.section.md
3953da6db1939145069c81713fae9a9bc32d6d23d81e0cc50000000300000859
# Generators {#sec-generators}
Generators are functions that create file formats from nix data structures, e. g. for configuration files. There are generators available for: `INI`, `JSON` and `YAML`

All generators follow a similar call interface: `generatorName configFunctions data`, where `configFunctions` is an attrset of user-defined functions that format nested parts of the content. They each have common defaults, so often they do not need to be set manually. An example is `mkSectionName ? (name: libStr.escape [ "[" "]" ] name)` from the `INI` generator. It receives the name of a section and sanitizes it. The default `mkSectionName` escapes `[` and `]` with a backslash.

Generators can be fine-tuned to produce exactly the file format required by your application/service. One example is an INI-file format which uses `: ` as separator, the strings `"yes"`/`"no"` as boolean values and requires all string values to be quoted:

```nix
let
  inherit (lib) generators isString;

  customToINI = generators.toINI {
    # specifies how to format a key/value pair
    mkKeyValue = generators.mkKeyValueDefault {
      # specifies the generated string for a subset of nix values
      mkValueString =
        v:
        if v == true then
          ''"yes"''
        else if v == false then
          ''"no"''
        else if isString v then
          ''"${v}"''
        # and delegates all other values to the default generator
        else
          generators.mkValueStringDefault { } v;
    } ":";
  };

  # the INI file can now be given as plain old nix values
in
customToINI {
  main = {
    pushinfo = true;
    autopush = false;
    host = "localhost";
    port = 42;
  };
  mergetool = {
    merge = "diff3";
  };
}
```

This will produce the following INI file as nix string:

```INI
[main]
autopush:"no"
host:"localhost"
port:42
pushinfo:"yes"
str\:ange:"very::strange"

[mergetool]
merge:"diff3"
```

::: {.note}
Nix store paths can be converted to strings by enclosing a derivation attribute like so: `"${drv}"`.
:::

Detailed documentation for each generator can be found [here](#sec-functions-library-generators)

Chunks
2e76db7d (1st chunk of `doc/functions/generators.section.md`)
Title: Nix Data Generators for File Formats
Summary
This section introduces "Generators" in Nix, which are functions designed to convert Nix data structures into various file formats, such as INI, JSON, and YAML. All generators share a common interface: `generatorName configFunctions data`. They allow for extensive customization through `configFunctions` to precisely control the output format, with default settings often sufficing. An example demonstrates how to create a custom INI generator (`customToINI`) to specify key-value separators, boolean string representations ("yes"/"no"), and quoted string values, showcasing how Nix data can be transformed into a specific INI file format.