101 lines
2.6 KiB
Nix
101 lines
2.6 KiB
Nix
|
# https://github.com/NixOS/nixpkgs/blob/a5cfe012401cfebb4b2c28e74857b8ffe1402b4b/lib/modules.nix
|
||
|
{ lib }:
|
||
|
with lib.modules;
|
||
|
let
|
||
|
inherit (lib)
|
||
|
addErrorContext
|
||
|
all
|
||
|
any
|
||
|
attrByPath
|
||
|
attrNames
|
||
|
catAttrs
|
||
|
concatLists
|
||
|
concatMap
|
||
|
concatStringsSep
|
||
|
elem
|
||
|
filter
|
||
|
foldl'
|
||
|
functionArgs
|
||
|
getAttrFromPath
|
||
|
genericClosure
|
||
|
head
|
||
|
id
|
||
|
imap1
|
||
|
isAttrs
|
||
|
isBool
|
||
|
isFunction
|
||
|
isInOldestRelease
|
||
|
isList
|
||
|
isString
|
||
|
length
|
||
|
mapAttrs
|
||
|
mapAttrsToList
|
||
|
mapAttrsRecursiveCond
|
||
|
min
|
||
|
optional
|
||
|
optionalAttrs
|
||
|
optionalString
|
||
|
recursiveUpdate
|
||
|
reverseList sort
|
||
|
seq
|
||
|
setAttrByPath
|
||
|
substring
|
||
|
throwIfNot
|
||
|
trace
|
||
|
typeOf
|
||
|
types
|
||
|
unsafeGetAttrPos
|
||
|
warn
|
||
|
warnIf
|
||
|
zipAttrs
|
||
|
zipAttrsWith
|
||
|
;
|
||
|
inherit (lib.options)
|
||
|
isOption
|
||
|
mkOption
|
||
|
showDefs
|
||
|
showFiles
|
||
|
showOption
|
||
|
unknownModule
|
||
|
;
|
||
|
inherit (lib.strings)
|
||
|
isConvertibleWithToString
|
||
|
;
|
||
|
|
||
|
unifyModuleSyntax = file: key: m:
|
||
|
let
|
||
|
addMeta = config: if m ? meta
|
||
|
then mkMerge [ config { meta = m.meta; } ]
|
||
|
else config;
|
||
|
addFreeformType = config: if m ? freeformType
|
||
|
then mkMerge [ config { _module.freeformType = m.freeformType; } ]
|
||
|
else config;
|
||
|
in
|
||
|
if m ? config || m ? options then
|
||
|
let badAttrs = removeAttrs m ["_class" "_file" "key" "disabledModules" "imports" "options" "config" "meta" "freeformType"]; in
|
||
|
if badAttrs != {} then
|
||
|
throw "Module `${key}' has an unsupported attribute `${head (attrNames badAttrs)}'. This is caused by introducing a top-level `config' or `options' attribute. Add configuration attributes immediately on the top level instead, or move all of them (namely: ${toString (attrNames badAttrs)}) into the explicit `config' attribute."
|
||
|
else
|
||
|
{ _file = toString m._file or file;
|
||
|
_class = m._class or null;
|
||
|
key = toString m.key or key;
|
||
|
disabledModules = m.disabledModules or [];
|
||
|
imports = m.imports or [];
|
||
|
options = m.options or {};
|
||
|
config = addFreeformType (addMeta (m.config or {}));
|
||
|
}
|
||
|
else
|
||
|
# shorthand syntax
|
||
|
throwIfNot (isAttrs m) "module ${file} (${key}) does not look like a module."
|
||
|
{ _file = toString m._file or file;
|
||
|
_class = m._class or null;
|
||
|
key = toString m.key or key;
|
||
|
disabledModules = m.disabledModules or [];
|
||
|
imports = m.require or [] ++ m.imports or [];
|
||
|
options = {};
|
||
|
config = addFreeformType (removeAttrs m ["_class" "_file" "key" "disabledModules" "require" "imports" "freeformType"]);
|
||
|
};
|
||
|
|
||
|
|
||
|
in {inherit unifyModuleSyntax;}
|