aboutsummaryrefslogtreecommitdiff
path: root/doc/manual/generate-options.nix
blob: a4ec36477d03f2359408d4179a76a495ba119e82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
let
  inherit (builtins) attrNames concatStringsSep isAttrs isBool;
  inherit (import ./utils.nix) concatStrings squash splitLines;
in

optionsInfo:
let
  showOption = name:
    let
      inherit (optionsInfo.${name}) description documentDefault defaultValue aliases;
      result = squash ''
          - <span id="conf-${name}">[`${name}`](#conf-${name})</span>

          ${indent "  " body}
        '';
      # separate body to cleanly handle indentation
      body = ''
          ${description}

          **Default:** ${showDefault documentDefault defaultValue}

          ${showAliases aliases}
        '';
      showDefault = documentDefault: defaultValue:
        if documentDefault then
          # a StringMap value type is specified as a string, but
          # this shows the value type. The empty stringmap is `null` in
          # JSON, but that converts to `{ }` here.
          if defaultValue == "" || defaultValue == [] || isAttrs defaultValue
            then "*empty*"
            else if isBool defaultValue then
              if defaultValue then "`true`" else "`false`"
            else "`${toString defaultValue}`"
        else "*machine-specific*";
      showAliases = aliases:
          if aliases == [] then "" else
            "**Deprecated alias:** ${(concatStringsSep ", " (map (s: "`${s}`") aliases))}";
      indent = prefix: s:
        concatStringsSep "\n" (map (x: if x == "" then x else "${prefix}${x}") (splitLines s));
      in result;
in concatStrings (map showOption (attrNames optionsInfo))