diff options
| author | Leander Scherer <leander@schererleander.de> | 2026-01-08 16:05:52 +0100 |
|---|---|---|
| committer | Leander Scherer <leander@schererleander.de> | 2026-01-08 19:08:13 +0100 |
| commit | e57e8cdfe59e1407ad73c192bd9f7f2b0b5005b5 (patch) | |
| tree | 7bb2b2ad7544a5779027b1bac5cf089a478a70d4 /lib/default.nix | |
| parent | e8f58189eb4d01ee2a7684a30b27fa187f37d1aa (diff) | |
refactor(desktop): conditionally import modules based on useHomeManager
Diffstat (limited to 'lib/default.nix')
| -rw-r--r-- | lib/default.nix | 167 |
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 |
