formats.ini: Introduce listToValue
argument (#121613)
Allows coercing lists to values. E.g. formats.ini { listToValue = lib.concatMapStringsSep ", " (lib.generators.mkValueStringDefault {}); }
This commit is contained in:
parent
3cc34f9e55
commit
b8336c2b8a
@ -50,7 +50,7 @@
|
|||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>
|
<term>
|
||||||
<varname>pkgs.formats.ini</varname> { <replaceable>listsAsDuplicateKeys</replaceable> ? false, ... }
|
<varname>pkgs.formats.ini</varname> { <replaceable>listsAsDuplicateKeys</replaceable> ? false, <replaceable>listToValue</replaceable> ? null, ... }
|
||||||
</term>
|
</term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
@ -66,6 +66,16 @@
|
|||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<varname>listToValue</varname>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
A function for turning a list of values into a single value.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
It returns a set with INI-specific attributes <varname>type</varname> and <varname>generate</varname> as specified <link linkend='pkgs-formats-result'>below</link>.
|
It returns a set with INI-specific attributes <varname>type</varname> and <varname>generate</varname> as specified <link linkend='pkgs-formats-result'>below</link>.
|
||||||
</para>
|
</para>
|
||||||
|
@ -56,7 +56,16 @@ rec {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
ini = { listsAsDuplicateKeys ? false, ... }@args: {
|
ini = {
|
||||||
|
# Represents lists as duplicate keys
|
||||||
|
listsAsDuplicateKeys ? false,
|
||||||
|
# Alternative to listsAsDuplicateKeys, converts list to non-list
|
||||||
|
# listToValue :: [IniAtom] -> IniAtom
|
||||||
|
listToValue ? null,
|
||||||
|
...
|
||||||
|
}@args:
|
||||||
|
assert !listsAsDuplicateKeys || listToValue == null;
|
||||||
|
{
|
||||||
|
|
||||||
type = with lib.types; let
|
type = with lib.types; let
|
||||||
|
|
||||||
@ -74,12 +83,25 @@ rec {
|
|||||||
coercedTo singleIniAtom lib.singleton (listOf singleIniAtom) // {
|
coercedTo singleIniAtom lib.singleton (listOf singleIniAtom) // {
|
||||||
description = singleIniAtom.description + " or a list of them for duplicate keys";
|
description = singleIniAtom.description + " or a list of them for duplicate keys";
|
||||||
}
|
}
|
||||||
|
else if listToValue != null then
|
||||||
|
coercedTo singleIniAtom lib.singleton (nonEmptyListOf singleIniAtom) // {
|
||||||
|
description = singleIniAtom.description + " or a non-empty list of them";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
singleIniAtom;
|
singleIniAtom;
|
||||||
|
|
||||||
in attrsOf (attrsOf iniAtom);
|
in attrsOf (attrsOf iniAtom);
|
||||||
|
|
||||||
generate = name: value: pkgs.writeText name (lib.generators.toINI args value);
|
generate = name: value:
|
||||||
|
let
|
||||||
|
transformedValue =
|
||||||
|
if listToValue != null
|
||||||
|
then
|
||||||
|
lib.mapAttrs (section: lib.mapAttrs (key: val:
|
||||||
|
if lib.isList val then listToValue val else val
|
||||||
|
)) value
|
||||||
|
else value;
|
||||||
|
in pkgs.writeText name (lib.generators.toINI (removeAttrs args ["listToValue"]) transformedValue);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -124,6 +124,22 @@ in runBuildTests {
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
testIniListToValue = {
|
||||||
|
drv = evalFormat formats.ini { listToValue = concatMapStringsSep ", " (generators.mkValueStringDefault {}); } {
|
||||||
|
foo = {
|
||||||
|
bar = [ null true "test" 1.2 10 ];
|
||||||
|
baz = false;
|
||||||
|
qux = "qux";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
expected = ''
|
||||||
|
[foo]
|
||||||
|
bar=null, true, test, 1.200000, 10
|
||||||
|
baz=false
|
||||||
|
qux=qux
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
testTomlAtoms = {
|
testTomlAtoms = {
|
||||||
drv = evalFormat formats.toml {} {
|
drv = evalFormat formats.toml {} {
|
||||||
false = false;
|
false = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user