blob: bcf3806d81a49038631db162310ce3664741a894 [file] [log] [blame]
Skyler Grey51e18512022-08-20 12:24:19 +01001# As our modules have nonstandard properties, we need to have some way of
2# properly intepreting them
3# This function takes a list of modules, as well as arguments to import them
4# with, and returns a list of modules, each with the standard NixOS module
5# properties as well as with custom properties as described in /README.md
Skyler Grey252927a2022-10-18 22:18:15 +01006lib: transformArgs: modules: args @ { pkgs, ... }:
7let
8 resolver = module:
9 let
10 importedModule =
11 if builtins.typeOf module == "path"
12 then import module
13 else module;
14 resolvedModule =
15 if builtins.typeOf importedModule == "lambda"
16 then
17 importedModule
18 (transformArgs args)
19 else importedModule;
20 moduleName =
21 if builtins.typeOf module == "lambda"
22 then "<AnonFunction>"
23 else if builtins.typeOf module == "path"
24 then builtins.toString module
25 else builtins.toJSON module;
Skyler Greyf649adf2022-08-26 06:47:44 +010026 in
Skyler Grey252927a2022-10-18 22:18:15 +010027 lib.warnIfNot
28 ((lib.pipe resolvedModule [
29 builtins.attrNames
30 (lib.subtractLists [ "home" "config" "imports" "options" "traces" ])
31 ])
32 == [ ])
33 "Module ${moduleName} had attribute names ${builtins.toJSON (builtins.attrNames resolvedModule)} but only home, config, imports and options are resolved"
34 [
35 {
36 config = lib.recursiveUpdate (resolvedModule.config or { }) {
37 home-manager.users."${args.username}".imports =
38 (resolvedModule.config.home-manager.users."${args.username}".imports or [ ])
39 ++ [ resolvedModule.home or { } ];
Skyler Grey345f12d2023-01-26 00:39:52 +000040 internal.traces = (resolvedModule.traces or [ ]);
Skyler Grey252927a2022-10-18 22:18:15 +010041 };
42 imports = resolvedModule.imports or [ ];
43 options = resolvedModule.options or { };
44 }
Skyler Grey345f12d2023-01-26 00:39:52 +000045 ];
Skyler Grey252927a2022-10-18 22:18:15 +010046in
47{
Skyler Greybcb2cb72022-08-21 07:24:35 +010048 imports = (
49 if builtins.typeOf modules == "list"
Skyler Greyf649adf2022-08-26 06:47:44 +010050 then builtins.concatLists (builtins.map resolver modules)
51 else resolver modules
Skyler Greybcb2cb72022-08-21 07:24:35 +010052 );
53}