Initial commit
This commit is contained in:
135
modules/schema.nix
Normal file
135
modules/schema.nix
Normal file
@@ -0,0 +1,135 @@
|
||||
{ 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 = [ ];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user