-
-
Notifications
You must be signed in to change notification settings - Fork 303
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
lib/deprecation: init with mkDeprecatedSubOptionModule
Similar to `lib.mkRemovedOptionModule` but tweaked to work with sub-options (e.g. settings options). Also uses warnings instead of assertions.
- Loading branch information
1 parent
66c8592
commit 54d1188
Showing
2 changed files
with
51 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
{ lib, ... }: | ||
with lib; | ||
rec { | ||
# Get a (sub)option by walking the path, | ||
# checking for submodules along the way | ||
getOptionRecursive = | ||
opt: prefix: optionPath: | ||
if optionPath == [ ] then | ||
opt | ||
else if isOption opt then | ||
getOptionRecursive (opt.type.getSubOptions prefix) prefix optionPath | ||
else | ||
let | ||
name = head optionPath; | ||
opt' = getAttr name opt; | ||
prefix' = prefix ++ [ name ]; | ||
optionPath' = drop 1 optionPath; | ||
in | ||
getOptionRecursive opt' prefix' optionPath'; | ||
|
||
# Like mkRemovedOptionModule, but has support for nested sub-options | ||
# and uses warnings instead of assertions. | ||
mkDeprecatedSubOptionModule = | ||
optionPath: replacementInstructions: | ||
{ options, ... }: | ||
{ | ||
options = setAttrByPath optionPath (mkOption { | ||
# When (e.g.) `mkAttrs` is used on a submodule, this option will be evaluated. | ||
# Therefore we have to apply _something_ (null) when there's no definition. | ||
apply = | ||
v: | ||
let | ||
# Avoid "option used but not defined" errors | ||
res = builtins.tryEval v; | ||
in | ||
if res.success then res.value else null; | ||
visible = false; | ||
}); | ||
config.warnings = | ||
let | ||
opt = getOptionRecursive options [ ] optionPath; | ||
in | ||
optional opt.isDefined '' | ||
The option definition `${showOption optionPath}' in ${showFiles opt.files} is deprecated. | ||
${replacementInstructions} | ||
''; | ||
}; | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters