Files
clan-core/lib/inventory/build-inventory/interface.nix
2024-09-15 16:41:33 +00:00

159 lines
3.8 KiB
Nix

{ config, lib, ... }:
let
types = lib.types;
metaOptions = {
name = lib.mkOption { type = types.str; };
description = lib.mkOption {
default = null;
type = types.nullOr types.str;
};
icon = lib.mkOption {
default = null;
type = types.nullOr types.str;
};
};
metaOptionsWith = name: {
name = lib.mkOption {
type = types.str;
default = name;
};
description = lib.mkOption {
default = null;
type = types.nullOr types.str;
};
icon = lib.mkOption {
default = null;
type = types.nullOr types.str;
};
};
moduleConfig = lib.mkOption {
default = { };
type = types.attrsOf types.anything;
};
extraModulesOption = lib.mkOption {
description = ''
List of imported '.nix' expressions.
Strings are interpreted relative to the 'directory' passed to buildClan.
The import only happens if the machine is part of the service or role.
Other types are passed through to the nixos configuration.
## Example
To import the `special.nix` file
```
. Clan Directory
flake.nix
...
modules
special.nix
...
```
```nix
{
extraModules = [ "modules/special.nix" ];
}
```
'';
default = [ ];
type = types.listOf (
types.oneOf [
types.str
types.anything
]
);
};
in
{
imports = [ ./assertions.nix ];
options = {
assertions = lib.mkOption {
type = types.listOf types.unspecified;
internal = true;
visible = false;
default = [ ];
};
meta = metaOptions;
machines = lib.mkOption {
default = { };
type = types.attrsOf (
types.submodule (
{ name, ... }:
{
options = {
inherit (metaOptionsWith name) name description icon;
tags = lib.mkOption {
default = [ ];
apply = lib.unique;
type = types.listOf types.str;
};
system = lib.mkOption {
default = null;
type = types.nullOr types.str;
};
deploy.targetHost = lib.mkOption {
description = "Configuration for the deployment of the machine";
default = null;
type = types.nullOr types.str;
};
};
}
)
);
};
services = lib.mkOption {
default = { };
type = types.attrsOf (
types.attrsOf (
types.submodule (
{ name, ... }:
{
options.meta = metaOptionsWith name;
options.extraModules = extraModulesOption;
options.config = moduleConfig;
options.machines = lib.mkOption {
default = { };
type = types.attrsOf (
types.submodule {
options.extraModules = extraModulesOption;
options.config = moduleConfig;
}
);
};
options.roles = lib.mkOption {
default = { };
type = types.attrsOf (
types.submodule {
options.machines = lib.mkOption {
default = [ ];
type = types.listOf types.str;
};
options.tags = lib.mkOption {
default = [ ];
apply = lib.unique;
type = types.listOf types.str;
};
options.config = moduleConfig;
options.extraModules = extraModulesOption;
}
);
};
}
)
)
);
};
};
}