Hi all;
This is a bit of a long shot; but I’m having an issue with trying to modularize my config in preparation for a new laptop.
In particular the issue I have is around passing a path through to an import statement for a home-managed user.
In particular I’m getting undefinedVariable hmPath; but it doesn’t seem to be having the same issue when I’m mapping groups and shell; so I can only assume that imports has to be treated differently but I’m at a loss.
Any help on what I’ve misunderstood would be greatly appreciated.
Snippet below
{ pkgs, config, options, lib, home-manager, ... }:
with lib; let
cfg = config.ltp.home;
user = types.submodule ({name, ...}: {
options = {
doas.enable = mkEnableOption {
default = false;
type = types.bool;
};
groups = mkOption {
default = [];
type = types.listOf string;
};
shell = mkOption {
default = pkgs.bash;
type = types.package;
};
hmPath = mkOption {
type = types.path;
};
};
});
in
{
options.ltp.home = {
users = mkOption {
description = Attrset of home-manager users;
default = {};
type = types.attrsOf user;
};
};
config = mkIf (cfg.users != {}) (mkMerge [
{
users.users = let mkUser =
lib.attrsets.mapAttrs'
(
name: value:
lib.attrsets.nameValuePair
"${builtins.baseNameOf name}"
{
isNormalUser = true;
extraGroups = "${groups}";
shell = "${shell}";
}
)
cfg.users;
in
mkUser;
home-manager.users = let mkHmUser =
lib.attrsets.mapAttrs'
(
name: value:
lib.attrsets.nameValuePair
"${builtins.baseNameOf name}"
{
imports = [ "${hmPath}" ];
}
)
cfg.users;
in
mkHmUser;
}
]);
}
Edit…
Solved the initial issue I was confusing myself and should’ve been using value.hmPath and equivalent inside the lib functions.
Next issue; I’m having is I can’t seem to pass through the path for the home-manager module for the user that is give to the import statement.
Edit 2…
I didn’t manage to get it working how I was doing it so I’ve changed my approach; to implicitly reference the users home-manager base module based on the folder structure e.g. ./hosts/${hostname}/users/${builtins.baseNameOf name}