forked from lix-project/lix
dfa27e6b2f
this makes more obvious what the code produces, and the structure of the output easier to change
42 lines
1.5 KiB
Nix
42 lines
1.5 KiB
Nix
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 ''
|
|
- [`${name}`]{#conf-${name}}
|
|
|
|
${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))
|