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:
parent
2f861e6ba6
commit
ea412cd5a1
|
@ -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;
|
||||||
|
|
|
@ -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 = "";
|
||||||
|
|
Loading…
Reference in New Issue