aboutsummaryrefslogtreecommitdiff
path: root/lib/default.nix
diff options
context:
space:
mode:
authorLeander Scherer <leander@schererleander.de>2026-01-08 16:05:52 +0100
committerLeander Scherer <leander@schererleander.de>2026-01-08 19:08:13 +0100
commite57e8cdfe59e1407ad73c192bd9f7f2b0b5005b5 (patch)
tree7bb2b2ad7544a5779027b1bac5cf089a478a70d4 /lib/default.nix
parente8f58189eb4d01ee2a7684a30b27fa187f37d1aa (diff)
refactor(desktop): conditionally import modules based on useHomeManager
Diffstat (limited to 'lib/default.nix')
-rw-r--r--lib/default.nix167
1 files changed, 154 insertions, 13 deletions
diff --git a/lib/default.nix b/lib/default.nix
index 76bcb08..5424801 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -5,6 +5,134 @@ let
isDarwin = s: lib.strings.hasSuffix "-darwin" s;
in
{
+ mkUser =
+ {
+ username,
+ homeDirectory ? null,
+ useHomeManager ? true,
+ extraHomeModules ? [ ],
+ }:
+ {
+ config,
+ pkgs,
+ lib,
+ system,
+ inputs,
+ ...
+ }:
+ let
+ inherit (lib)
+ mkOption
+ types
+ mkIf
+ mkMerge
+ optional
+ optionals
+ ;
+
+ darwinHost = isDarwin system;
+ defaultHome = if darwinHost then "/Users/${username}" else "/home/${username}";
+ home = if homeDirectory != null then homeDirectory else defaultHome;
+
+ anyDesktopEnabled =
+ (config.nx.desktop.kde.enable or false)
+ || (config.nx.desktop.hyprland.enable or false)
+ || (config.nx.desktop.gnome.enable or false)
+ || (config.nx.desktop.cinnamon.enable or false)
+ || (config.nx.desktop.sway.enable or false)
+ || (config.nx.desktop.labwc.enable or false);
+
+ cfg = config.nx.user.${username};
+
+ shellPkg = if (cfg.nx.terminal.defaultShell or "bash") == "zsh" then pkgs.zsh else pkgs.bash;
+ in
+ {
+ options.nx.user.${username} = mkOption {
+ description = "User configuration for ${username}";
+ type = types.submodule {
+ freeformType = types.attrsOf types.anything;
+ options = {
+ stateVersion = mkOption {
+ type = types.str;
+ description = "home.stateVersion for this user";
+ };
+
+ packages = mkOption {
+ type = types.listOf types.package;
+ default = [ ];
+ description = "Extra packages for this user";
+ };
+
+ shellAliases = mkOption {
+ type = types.attrsOf types.str;
+ default = { };
+ description = "Shell aliases";
+ };
+
+ sessionVariables = mkOption {
+ type = types.attrsOf types.str;
+ default = { };
+ description = "Session environment variables";
+ };
+
+ nx = mkOption {
+ type = types.attrsOf types.anything;
+ default = { };
+ description = "User module options (proxied to home-manager's nx.*)";
+ };
+ };
+ };
+ default = { };
+ };
+
+ config = mkMerge [
+ (mkIf (!darwinHost) {
+ users.users.${username} = {
+ isNormalUser = true;
+ home = home;
+ shell = shellPkg;
+ ignoreShellProgramCheck = true;
+ extraGroups =
+ [
+ "wheel"
+ ]
+ ++ optional (config.networking.networkmanager.enable or false) "networkmanager"
+ ++ optionals anyDesktopEnabled [
+ "video"
+ "input"
+ ]
+ ++ optional (config.nx.services.audio.enable or false) "audio"
+ ++ optional (config.nx.printer.enable or false) "lp";
+ };
+ })
+
+ (mkIf darwinHost {
+ users.users.${username}.home = home;
+ })
+
+ (mkIf useHomeManager {
+ home-manager.extraSpecialArgs = { inherit inputs; };
+
+ home-manager.users.${username} = {
+ home.username = username;
+ home.homeDirectory = home;
+ home.stateVersion = cfg.stateVersion;
+ home.packages = cfg.packages;
+ home.sessionVariables = cfg.sessionVariables;
+
+ programs.home-manager.enable = true;
+
+ programs.zsh.shellAliases = mkIf (cfg.nx.terminal.defaultShell == "zsh") cfg.shellAliases;
+ programs.bash.shellAliases = mkIf (cfg.nx.terminal.defaultShell == "bash") cfg.shellAliases;
+
+ imports = [ ../modules/users ] ++ extraHomeModules;
+
+ nx = cfg.nx;
+ };
+ })
+ ];
+ };
+
mkSystem =
{
host,
@@ -14,13 +142,17 @@ in
extraModules ? [ ],
extraSpecialArgs ? { },
useHomeManager ? true,
+ extraHomeModules ? [ ],
}:
let
darwinHost = isDarwin system;
- builder = if darwinHost then inputs.nix-darwin.lib.darwinSystem else inputs.nixpkgs.lib.nixosSystem;
+ builder =
+ if darwinHost then inputs.nix-darwin.lib.darwinSystem else inputs.nixpkgs.lib.nixosSystem;
hostDir = ../hosts/${host};
hostCfg = hostDir + /configuration.nix;
+ self = import ./. { inherit inputs; };
+
nixpkgsModule = {
nixpkgs.overlays = overlays;
nixpkgs.config.allowUnfree = true;
@@ -31,18 +163,26 @@ in
];
};
- modules = [
- hostCfg
- nixpkgsModule
- ]
- ++ (lib.optional (!darwinHost) ../modules/hosts)
- ++ (lib.optional useHomeManager (
- if darwinHost then
- inputs.home-manager.darwinModules.home-manager
- else
- inputs.home-manager.nixosModules.home-manager
- ))
- ++ extraModules;
+ modules =
+ [
+ hostCfg
+ nixpkgsModule
+ ]
+ ++ (lib.optional (!darwinHost) ../modules/hosts)
+ ++ (lib.optional useHomeManager (
+ if darwinHost then
+ inputs.home-manager.darwinModules.home-manager
+ else
+ inputs.home-manager.nixosModules.home-manager
+ ))
+ ++ (lib.optional useHomeManager (self.mkUser {
+ inherit
+ username
+ useHomeManager
+ extraHomeModules
+ ;
+ }))
+ ++ extraModules;
in
builder {
system = system;
@@ -53,6 +193,7 @@ in
system
host
username
+ useHomeManager
;
}
// extraSpecialArgs