{ lib, ... }: { den.schema = { user = { config, ... }: let primaryEmailCount = builtins.length (lib.filter (email: email.primary) (builtins.attrValues config.emails)); in { options = { realName = lib.mkOption { type = lib.types.str; }; authorizedSshKeys = lib.mkOption { type = lib.types.listOf lib.types.str; default = [ ]; }; emails = lib.mkOption { type = lib.types.attrsOf ( lib.types.submodule ( { ... }: { options = { address = lib.mkOption { type = lib.types.str; }; primary = lib.mkOption { type = lib.types.bool; default = false; }; kind = lib.mkOption { type = lib.types.enum [ "mxrouting" "office365" ]; }; }; } ) ); default = { }; }; syncthingId = lib.mkOption { type = lib.types.nullOr lib.types.str; default = null; }; }; config = { assertions = [ { assertion = primaryEmailCount == 1; message = "Each user must define exactly one primary email."; } ]; classes = lib.mkDefault [ "homeManager" ]; }; }; host = { options = { serviceDomain = lib.mkOption { type = lib.types.str; }; displays = lib.mkOption { type = lib.types.attrsOf ( lib.types.submodule ( { ... }: { options = { position = lib.mkOption { type = lib.types.submodule { options = { x = lib.mkOption { type = lib.types.int; }; y = lib.mkOption { type = lib.types.int; }; }; }; }; scale = lib.mkOption { type = lib.types.nullOr (lib.types.oneOf [ lib.types.int lib.types.float ]); default = null; }; primary = lib.mkOption { type = lib.types.bool; default = false; }; mode = lib.mkOption { type = lib.types.nullOr ( lib.types.submodule ( { ... }: { options = { width = lib.mkOption { type = lib.types.int; }; height = lib.mkOption { type = lib.types.int; }; refresh = lib.mkOption { type = lib.types.nullOr lib.types.float; default = null; }; }; } ) ); default = null; }; }; } ) ); default = { }; }; requiresSshRecovery = lib.mkOption { type = lib.types.bool; default = false; }; sshRecoveryUsers = lib.mkOption { type = lib.types.listOf lib.types.str; default = [ ]; }; sopsHostSshKeyPath = lib.mkOption { type = lib.types.nullOr lib.types.str; default = null; }; sopsAdminKeyPath = lib.mkOption { type = lib.types.nullOr lib.types.str; default = null; }; sopsAdminKeyUsers = lib.mkOption { type = lib.types.listOf lib.types.str; default = [ ]; }; }; }; }; }