nixos,lib: move environment generation related copy-paste to lib

Changed files
+20 -29
lib
nixos
+18 -1
lib/types.nix
···
with import ./options.nix;
with import ./trivial.nix;
with import ./strings.nix;
-
with {inherit (import ./modules.nix) mergeDefinitions; };
+
with {inherit (import ./modules.nix) mergeDefinitions filterOverrides; };
rec {
···
getSubModules = elemType.getSubModules;
substSubModules = m: loaOf (elemType.substSubModules m);
};
+
+
# List or element of ...
+
loeOf = elemType: mkOptionType {
+
name = "element or list of ${elemType.name}s";
+
check = x: isList x || elemType.check x;
+
merge = loc: defs:
+
let
+
defs' = filterOverrides defs;
+
res = (head defs').value;
+
in
+
if isList res then concatLists (getValues defs')
+
else if lessThan 1 (length defs') then
+
throw "The option `${showOption loc}' is defined multiple times, in ${showFiles (getFiles defs)}."
+
else if !isString res then
+
throw "The option `${showOption loc}' does not have a string value, in ${showFiles (getFiles defs)}."
+
else res;
+
};
uniq = elemType: mkOptionType {
inherit (elemType) name check;
+1 -14
nixos/modules/config/shells-environment.nix
···
strings. The latter is concatenated, interspersed with colon
characters.
'';
-
type = types.attrsOf (mkOptionType {
-
name = "a string or a list of strings";
-
merge = loc: defs:
-
let
-
defs' = filterOverrides defs;
-
res = (head defs').value;
-
in
-
if isList res then concatLists (getValues defs')
-
else if lessThan 1 (length defs') then
-
throw "The option `${showOption loc}' is defined multiple times, in ${showFiles (getFiles defs)}."
-
else if !isString res then
-
throw "The option `${showOption loc}' does not have a string value, in ${showFiles (getFiles defs)}."
-
else res;
-
});
+
type = types.attrsOf (types.loeOf types.str);
apply = mapAttrs (n: v: if isList v then concatStringsSep ":" v else v);
};
+1 -14
nixos/modules/config/system-environment.nix
···
strings. The latter is concatenated, interspersed with colon
characters.
'';
-
type = types.attrsOf (mkOptionType {
-
name = "a string or a list of strings";
-
merge = loc: defs:
-
let
-
defs' = filterOverrides defs;
-
res = (head defs').value;
-
in
-
if isList res then concatLists (getValues defs')
-
else if lessThan 1 (length defs') then
-
throw "The option `${showOption loc}' is defined multiple times, in ${showFiles (getFiles defs)}."
-
else if !isString res then
-
throw "The option `${showOption loc}' does not have a string value, in ${showFiles (getFiles defs)}."
-
else res;
-
});
+
type = types.attrsOf (types.loeOf types.str);
apply = mapAttrs (n: v: if isList v then concatStringsSep ":" v else v);
};