136 lines
4.0 KiB
Nix
136 lines
4.0 KiB
Nix
{ 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 = [ ];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|