{ config, lib, ... }: let inherit (lib) mkOption types ; cfg = config.valhalla; capitalize = (import ../text.nix { inherit lib; }).capitalize; syncType = types.submodule ( { ... }: { options = { dirName = mkOption { type = types.str; description = "The name of the directory to sync the remote files to."; }; cacheDuration = mkOption { type = types.nullOr types.str; description = "The amount of time to keep cached files."; default = null; }; }; }); mkUserType = { options }: ( 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 = []; }; defaultShell = mkOption { type = types.nullOr types.str; description = "The default shell of the user."; default = null; }; rclone = { configurations = mkOption { type = types.attrsOf syncType; description = "The configurations of the rclone mounts."; default = {}; }; }; git = (import ./git/options.nix) { inherit lib; }; } // options; })); userType = mkUserType { options = {}; }; winUserType = mkUserType { options = { microsoftAccount = mkOption { type = types.bool; description = "A value indicating whether this user is a Microsoft Account."; default = false; }; }; }; in { options = { valhalla = { users = mkOption { type = types.attrsOf userType; description = "The users to create on the machine."; default = {}; }; windows.users = mkOption { type = types.attrsOf winUserType; description = "The users to create on the Windows machine."; default = lib.attrsets.concatMapAttrs ( name: options: { ${capitalize name} = options; }) cfg.users; }; }; }; }