lib/modules: extract isDisabled from filterModules

Co-authored-by: Shahar "Dawn" Or <mightyiampresence@gmail.com>
This commit is contained in:
Ali Jamadi 2025-06-14 15:04:49 +07:00 committed by Shahar "Dawn" Or
parent ff774a4289
commit 2c1ec14d12

View File

@ -424,8 +424,37 @@ let
else
m: m;
# isDisabled :: String -> [ { disabled, file } ] -> StructuredModule -> bool
#
# Figures out whether a `StructuredModule` is disabled.
isDisabled =
modulesPath: disabledList:
let
moduleKey =
file: m:
if isString m then
if substring 0 1 m == "/" then m else toString modulesPath + "/" + m
else if isConvertibleWithToString m then
if m ? key && m.key != toString m then
throw "Module `${file}` contains a disabledModules item that is an attribute set that can be converted to a string (${toString m}) but also has a `.key` attribute (${m.key}) with a different value. This makes it ambiguous which module should be disabled."
else
toString m
else if m ? key then
m.key
else if isAttrs m then
throw "Module `${file}` contains a disabledModules item that is an attribute set, presumably a module, that does not have a `key` attribute. This means that the module system doesn't have any means to identify the module that should be disabled. Make sure that you've put the correct value in disabledModules: a string path relative to modulesPath, a path value, or an attribute set with a `key` attribute."
else
throw "Each disabledModules item must be a path, string, or a attribute set with a key attribute, or a value supported by toString. However, one of the disabledModules items in `${toString file}` is none of that, but is of type ${typeOf m}.";
disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabledList;
in
structuredModule: elem structuredModule.key disabledKeys;
/**
Collects all modules recursively into the form
Collects all modules recursively into a `[ StructuredModule ]` and a list of disabled modules:
{
disabled = [ <list of disabled modules> ];
@ -493,27 +522,7 @@ let
modulesPath:
{ disabled, modules }:
let
moduleKey =
file: m:
if isString m then
if substring 0 1 m == "/" then m else toString modulesPath + "/" + m
else if isConvertibleWithToString m then
if m ? key && m.key != toString m then
throw "Module `${file}` contains a disabledModules item that is an attribute set that can be converted to a string (${toString m}) but also has a `.key` attribute (${m.key}) with a different value. This makes it ambiguous which module should be disabled."
else
toString m
else if m ? key then
m.key
else if isAttrs m then
throw "Module `${file}` contains a disabledModules item that is an attribute set, presumably a module, that does not have a `key` attribute. This means that the module system doesn't have any means to identify the module that should be disabled. Make sure that you've put the correct value in disabledModules: a string path relative to modulesPath, a path value, or an attribute set with a `key` attribute."
else
throw "Each disabledModules item must be a path, string, or a attribute set with a key attribute, or a value supported by toString. However, one of the disabledModules items in `${toString file}` is none of that, but is of type ${typeOf m}.";
disabledKeys = concatMap ({ file, disabled }: map (moduleKey file) disabled) disabled;
keyFilter = filter (attrs: !elem attrs.key disabledKeys);
keyFilter = filter (attrs: !isDisabled modulesPath disabled attrs);
in
map (attrs: attrs.module) (genericClosure {
startSet = keyFilter modules;