{ config, lib, ... }: let inherit (lib) mkOption types ; cfg = config.valhalla; capitalize = (import ../text.nix { inherit lib; }).capitalize; in { options = { valhalla = { users = mkOption { type = types.attrsOf (types.submodule ( { ... }: { options = { displayName = mkOption { type = types.nullOr types.str; description = "The human-readable name of the user."; default = null; }; mailAddress = mkOption { type = types.nullOr types.str; description = "The mail address of the user."; default = null; }; groups = mkOption { type = types.listOf types.str; description = "The additional groups of the user."; default = []; }; }; })); description = "The users to create on the machine."; default = {}; }; linux.users = mkOption { type = types.attrsOf (types.submodule { options = { defaultShell = mkOption { type = types.nullOr types.str; description = "The default shell of the user."; default = null; }; }; }); }; windows.users = mkOption { type = types.attrsOf (types.submodule { options = { microsoftAccount = mkOption { type = types.bool; description = "A value indicating whether this user is a Microsoft Account."; default = false; }; }; }); }; }; }; config = { valhalla.windows.users = lib.mkForce (lib.attrsets.concatMapAttrs ( name: options: { ${capitalize name} = options // { groups = []; }; }) cfg.users); }; }