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 { 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. * attrset of sections to an attrset of key-value pairs.
* *
* generators.toINI {} { * generators.toINI {} {
@ -41,17 +63,16 @@ rec {
# apply transformations (e.g. escapes) to section names # apply transformations (e.g. escapes) to section names
mkSectionName ? (name: libStr.escape [ "[" "]" ] name), mkSectionName ? (name: libStr.escape [ "[" "]" ] name),
# format a setting line from key and value # format a setting line from key and value
mkKeyValue ? (k: v: "${libStr.escape ["="] k}=${toString v}") mkKeyValue ? mkKeyValueLine "="
}: attrsOfAttrs: }: attrsOfAttrs:
let let
# map function to string for each key val # map function to string for each key val
mapAttrsToStringsSep = sep: mapFn: attrs: mapAttrsToStringsSep = sep: mapFn: attrs:
libStr.concatStringsSep sep libStr.concatStringsSep sep
(libAttr.mapAttrsToList mapFn attrs); (libAttr.mapAttrsToList mapFn attrs);
mkLine = k: v: mkKeyValue k v + "\n";
mkSection = sectName: sectValues: '' mkSection = sectName: sectValues: ''
[${mkSectionName sectName}] [${mkSectionName sectName}]
'' + libStr.concatStrings (libAttr.mapAttrsToList mkLine sectValues); '' + toKeyValue { inherit mkKeyValue; } sectValues;
in in
# map input to ini sections # map input to ini sections
mapAttrsToStringsSep "\n" mkSection attrsOfAttrs; mapAttrsToStringsSep "\n" mkSection attrsOfAttrs;

View file

@ -135,6 +135,22 @@ runTests {
# these tests assume attributes are converted to lists # these tests assume attributes are converted to lists
# in alphabetical order # 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 = { testToINIEmpty = {
expr = generators.toINI {} {}; expr = generators.toINI {} {};
expected = ""; expected = "";