diff options
author | Profpatsch <mail@profpatsch.de> | 2022-03-14 10:14:18 +0100 |
---|---|---|
committer | Profpatsch <mail@profpatsch.de> | 2022-03-14 10:21:15 +0100 |
commit | ab03ddc8f441a11644a4ce3d29eb290fa02b11e3 (patch) | |
tree | 70b3a3752412e3caf6ca215f199e384f21b0d477 /lib/generators.nix | |
parent | 31961f641557fb4b9c96250e68f520a768d5e303 (diff) |
lib.generators: add toINIWithGlobalSection
As discussed in https://github.com/NixOS/nixpkgs/pull/118925#issuecomment-821112723, this is the best way of adding global sections to `toINI` without employing heuristics (i.e. checking whether something is an attrset).
Diffstat (limited to 'lib/generators.nix')
-rw-r--r-- | lib/generators.nix | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/generators.nix b/lib/generators.nix index 79ae9055ce3d9..c421573a727be 100644 --- a/lib/generators.nix +++ b/lib/generators.nix @@ -130,6 +130,51 @@ rec { # map input to ini sections mapAttrsToStringsSep "\n" mkSection attrsOfAttrs; + /* Generate an INI-style config file from an attrset + * specifying the global section (no header), and an + * attrset of sections to an attrset of key-value pairs. + * + * generators.toINIWithGlobalSection {} { + * globalSection = { + * someGlobalKey = "hi"; + * }; + * sections = { + * foo = { hi = "${pkgs.hello}"; ciao = "bar"; }; + * baz = { "also, integers" = 42; }; + * } + * + *> someGlobalKey=hi + *> + *> [baz] + *> also, integers=42 + *> + *> [foo] + *> ciao=bar + *> hi=/nix/store/y93qql1p5ggfnaqjjqhxcw0vqw95rlz0-hello-2.10 + * + * The mk* configuration attributes can generically change + * the way sections and key-value strings are generated. + * + * For more examples see the test cases in ./tests.nix. + * + * If you don’t need a global section, you can also use + * `generators.toINI` directly, which only takes + * the part in `sections`. + */ + toINIWithGlobalSection = { + # apply transformations (e.g. escapes) to section names + mkSectionName ? (name: libStr.escape [ "[" "]" ] name), + # format a setting line from key and value + mkKeyValue ? mkKeyValueDefault {} "=", + # allow lists as values for duplicate keys + listsAsDuplicateKeys ? false + }: { globalSection, sections }: + ( if globalSection == {} + then "" + else (toKeyValue { inherit mkKeyValue listsAsDuplicateKeys; } globalSection) + + "\n") + + (toINI { inherit mkSectionName mkKeyValue listsAsDuplicateKeys; } sections); + /* Generate a git-config file from an attrset. * * It has two major differences from the regular INI format: |