lib/generators: add toKeyValue & mkKeyValueLine (#20903)

generators for the common use case of simple config files which hold keys and
values. Used in the implementation for toINI.
This commit is contained in:
Profpatsch 2016-12-04 22:11:24 +01:00 committed by GitHub
parent 2f861e6ba6
commit ea412cd5a1
2 changed files with 41 additions and 4 deletions

View File

@ -17,7 +17,29 @@ in
rec {
/* Generates an INI-style config file from an
/* Generate a line of key k and value v, separated by
* character sep. If sep appears in k, it is escaped.
* Helper for synaxes with different separators.
*
* mkKeyValueLine ":" "f:oo" "bar"
* > "f\:oo:bar"
*/
mkKeyValueLine = sep: k: v:
"${libStr.escape [sep] k}${sep}${toString v}";
/* Generate a key-value-style config file from an attrset.
*
* mkKeyValue is the same as in toINI.
*/
toKeyValue = {
mkKeyValue ? mkKeyValueLine "="
}: attrs:
let mkLine = k: v: mkKeyValue k v + "\n";
in libStr.concatStrings (libAttr.mapAttrsToList mkLine attrs);
/* Generate an INI-style config file from an
* attrset of sections to an attrset of key-value pairs.
*
* generators.toINI {} {
@ -41,17 +63,16 @@ rec {
# apply transformations (e.g. escapes) to section names
mkSectionName ? (name: libStr.escape [ "[" "]" ] name),
# format a setting line from key and value
mkKeyValue ? (k: v: "${libStr.escape ["="] k}=${toString v}")
mkKeyValue ? mkKeyValueLine "="
}: attrsOfAttrs:
let
# map function to string for each key val
mapAttrsToStringsSep = sep: mapFn: attrs:
libStr.concatStringsSep sep
(libAttr.mapAttrsToList mapFn attrs);
mkLine = k: v: mkKeyValue k v + "\n";
mkSection = sectName: sectValues: ''
[${mkSectionName sectName}]
'' + libStr.concatStrings (libAttr.mapAttrsToList mkLine sectValues);
'' + toKeyValue { inherit mkKeyValue; } sectValues;
in
# map input to ini sections
mapAttrsToStringsSep "\n" mkSection attrsOfAttrs;

View File

@ -135,6 +135,22 @@ runTests {
# these tests assume attributes are converted to lists
# in alphabetical order
testMkKeyValueLine = {
expr = generators.mkKeyValueLine ":" "f:oo" "bar";
expected = ''f\:oo:bar'';
};
testToKeyValue = {
expr = generators.toKeyValue {} {
key = "value";
"other=key" = "baz";
};
expected = ''
key=value
other\=key=baz
'';
};
testToINIEmpty = {
expr = generators.toINI {} {};
expected = "";