{ config, lib, ... }@extraArgs: let cfg = config.personal.user; importedHomeManager = extraArgs ? home-manager; in { imports = lib.optional importedHomeManager extraArgs.home-manager.nixosModules.home-manager; options.personal.user = { enable = lib.mkEnableOption "main user"; name = lib.mkOption { type = lib.types.str; default = "qaristote"; }; homeManager = { enable = lib.mkEnableOption "home-manager"; }; }; config = lib.mkIf cfg.enable ( { users.users."${cfg.name}" = { isNormalUser = true; extraGroups = [ "wheel" ] ++ lib.optional config.networking.networkmanager.enable "networkmanager"; openssh.authorizedKeys.keys = with config.personal.lib.publicKeys.ssh; [ latitude-7490 precision-3571 ]; }; assertions = let missingArgAssertion = name: { assertion = lib.hasAttr name extraArgs || !cfg.homeManager.enable; message = "attribute ${name} missing: add it in lib.nixosSystem's specialArgs, or set config.personal.user.homeManager.enable to false"; }; in [ (missingArgAssertion "homeModules") (missingArgAssertion "home-manager") ]; } // lib.optionalAttrs (importedHomeManager && extraArgs ? homeModules) { home-manager = lib.mkIf cfg.homeManager.enable { users."${cfg.name}" = { imports = extraArgs.homeModules; stylix.targets.emacs.enable = false; }; useGlobalPkgs = lib.mkDefault true; useUserPackages = lib.mkDefault true; # TODO fix this: only config.personal options seem to be passed (or not ?) extraSpecialArgs = (extraArgs.homeSpecialArgs or { }) // { osConfig = lib.mkDefault config; }; }; } ); }