a291c8690a
GitOrigin-RevId: e6e19f3d81a982a62e1bba08f0b4f7fdc21b4ea0
79 lines
2.2 KiB
Nix
79 lines
2.2 KiB
Nix
{ lib, ... }:
|
|
let
|
|
/* Generate an INI-style config file from an attrset
|
|
* specifying the global section (no header), and a
|
|
* list of sections which contain name/value pairs.
|
|
*
|
|
* generators.toINI {} {
|
|
* globalSection = [
|
|
* { name = "someGlobalKey"; value = "hi"; }
|
|
* ];
|
|
* sections = [
|
|
* { name = "foo"; value = [
|
|
* { name = "hi"; value = "${pkgs.hello}"; }
|
|
* { name = "ciao"; value = "bar"; }
|
|
* ];
|
|
* }
|
|
* { name = "baz";
|
|
* value = [ { name = "also, integers"; value = 42; } ];
|
|
* }
|
|
* ];
|
|
* }
|
|
*
|
|
*> someGlobalKey=hi
|
|
*>
|
|
*> [foo]
|
|
*> hi=/nix/store/y93qql1p5ggfnaqjjqhxcw0vqw95rlz0-hello-2.10
|
|
*> ciao=bar
|
|
*>
|
|
*> [baz]
|
|
*> also, integers=42
|
|
*>
|
|
*
|
|
* The mk* configuration attributes can generically change
|
|
* the way sections and key-value strings are generated.
|
|
*
|
|
* Order of the sections and of keys is preserved,
|
|
* duplicate keys are allowed.
|
|
*/
|
|
toINI =
|
|
{
|
|
# apply transformations (e.g. escapes) to section names
|
|
mkSectionName ? (name: lib.strings.escape [ "[" "]" ] name)
|
|
, # format a setting line from key and value
|
|
mkKeyValue ? lib.generators.mkKeyValueDefault { } "="
|
|
,
|
|
}: { globalSection, sections }:
|
|
let
|
|
mkSection = sectName: sectValues: ''
|
|
[${mkSectionName sectName}]
|
|
'' + toKeyValue { inherit mkKeyValue; } sectValues;
|
|
# map input to ini sections
|
|
mkSections = lib.strings.concatMapStringsSep "\n"
|
|
({ name, value }: mkSection name value)
|
|
sections;
|
|
mkGlobalSection =
|
|
if globalSection == [ ]
|
|
then ""
|
|
else toKeyValue { inherit mkKeyValue; } globalSection
|
|
+ "\n";
|
|
in
|
|
mkGlobalSection
|
|
+ mkSections;
|
|
|
|
/* Generate a name-value-style config file from a list.
|
|
*
|
|
* mkKeyValue is the same as in toINI.
|
|
*/
|
|
toKeyValue =
|
|
{ mkKeyValue ? lib.generators.mkKeyValueDefault { } "="
|
|
,
|
|
}:
|
|
let
|
|
mkLine = k: v: mkKeyValue k v + "\n";
|
|
mkLines = k: v: [ (mkLine k v) ];
|
|
in
|
|
nameValues: lib.strings.concatStrings (lib.concatLists (map ({ name, value }: mkLines name value) nameValues));
|
|
|
|
in
|
|
toINI
|