{ config, lib, ... }: let inherit (lib.options) mkEnableOption mkOption; inherit (lib.types) attrsOf listOf submodule str package ; inherit (config.alqueva) users; in { options.alqueva.users = mkOption { type = attrsOf (submodule { options = { tmpfiles = mkOption { description = "tmpfiles"; type = listOf str; default = [ ]; }; packages = mkOption { type = listOf package; default = [ ]; description = "Packages installed to the the defined user."; }; groups = mkOption { type = listOf str; default = [ ]; description = "Groups to add the defined user to."; }; shell = mkOption { type = package; default = config.programs.bash.package; description = "Shell the user wants to use."; }; enable = (mkEnableOption "this user.") // { default = true; }; }; }); description = "Users to have on the system."; default = { }; }; config = let enabledUsers = lib.filterAttrs (_: user: user.enable) users; in { users.users = builtins.mapAttrs (un: uc: { description = un; isNormalUser = true; extraGroups = uc.groups; inherit (uc) packages shell; initialPassword = "password"; }) enabledUsers; systemd.user.tmpfiles.users = builtins.mapAttrs (_: uc: { rules = uc.tmpfiles; }) enabledUsers; }; }