Skip to content

Instantly share code, notes, and snippets.

@TomSmeets
Created October 15, 2019 16:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TomSmeets/26eb902aaff621e22eecb13d2302793f to your computer and use it in GitHub Desktop.
Save TomSmeets/26eb902aaff621e22eecb13d2302793f to your computer and use it in GitHub Desktop.
diff --git a/lib/default.nix b/lib/default.nix
index f293a1defb1..786df12b3f0 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -105,7 +105,7 @@ let
mergeModules' mergeOptionDecls evalOptionValue mergeDefinitions
pushDownProperties dischargeProperties filterOverrides
sortProperties fixupOptionType mkIf mkAssert mkMerge mkOverride
- mkOptionDefault mkDefault mkForce mkVMOverride mkStrict
+ mkOptionDefault mkDefault mkForce mkVMOverride mkApply mkStrict
mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions
mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule
mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule
diff --git a/lib/modules.nix b/lib/modules.nix
index 71672c7d112..c65c9a07f84 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -358,8 +358,16 @@ rec {
if any (def: def.value._type or "" == "order") defs''.values
then sortProperties defs''.values
else defs''.values;
+
+ # Spilt into values and post processing with mkApply
+ defs4 = let
+ split = builtins.partition (def: def.value._type or "" == "apply") defs''';
+ in {
+ apply = x: foldl (a: f: f.value.content a) x split.right;
+ values = split.wrong;
+ };
in {
- values = defs''';
+ values = defs4;
inherit (defs'') highestPrio;
};
defsFinal = defsFinal'.values;
@@ -368,7 +376,7 @@ rec {
mergedValue = foldl' (res: def:
if type.check def.value then res
else throw "The option value `${showOption loc}' in `${def.file}' is not of type `${type.description}'.")
- (type.merge loc defsFinal) defsFinal;
+ (defsFinal.apply (type.merge loc defsFinal.values)) defsFinal.values;
isDefined = defsFinal != [];
@@ -520,6 +528,12 @@ rec {
mkForce = mkOverride 50;
mkVMOverride = mkOverride 10; # used by ‘nixos-rebuild build-vm’
+ # Apply a function to the merged value
+ mkApply = f: {
+ _type = "apply";
+ content = f;
+ };
+
mkStrict = builtins.trace "`mkStrict' is obsolete; use `mkOverride 0' instead." (mkOverride 0);
mkFixStrictness = id; # obsolete, no-op
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment