buildClan: Add automatic inventory import directory

This commit is contained in:
Qubasa
2025-01-17 20:57:13 +07:00
parent 3feaba2267
commit a64c054168
3 changed files with 77 additions and 1 deletions

View File

@@ -35,5 +35,6 @@ eval {
rest rest
# implementation # implementation
./module.nix ./module.nix
./imports.nix
]; ];
} }

View File

@@ -0,0 +1,72 @@
{
config,
lib,
...
}:
##################################
# #
# Handle the "imports" directory #
# #
##################################
let
inherit (config)
directory
;
# Check if the imports directory exists
# If it does, check if the files in the directory are allowed
importsDir =
if builtins.pathExists "${directory}/imports" then
(
let
allowedFiles = [
"inventory"
];
invalidImports = lib.filter (name: !(lib.elem name allowedFiles)) (
builtins.attrNames (builtins.readDir "${directory}/imports")
);
in
if invalidImports != [ ] then
builtins.throw ''
Invalid file imports/{${lib.concatStringsSep ", " invalidImports}}.
Allowed are imports/{${lib.concatStringsSep ", " allowedFiles}}
''
else
"${directory}/imports"
)
else
"${directory}/imports";
# Get the directory names in the inventory/imports directory
inventoryImportNames =
if builtins.pathExists "${importsDir}/inventory" then
let
inventoryEntries = builtins.readDir "${importsDir}/inventory";
invalidFiles = builtins.attrNames (lib.filterAttrs (_: type: type == "regular") inventoryEntries);
in
if invalidFiles != [ ] then
builtins.throw ''
Invalid file(s) in imports/inventory/{${lib.concatStringsSep ", " invalidFiles}}
Only directories are allowed.
''
else
builtins.attrNames (lib.filterAttrs (_: type: type == "directory") inventoryEntries)
else
[ ];
# Check if the roles directory exists in each inventory import
inventoryImportAttrsetWithCheck = lib.genAttrs inventoryImportNames (
name:
let
rolesDir = "${directory}/imports/inventory/${name}/roles";
in
if builtins.pathExists rolesDir then
rolesDir
else
builtins.throw "The module ${name} is not inventory compatible because the roles directory does not exist at ${rolesDir}"
);
in
{
inventory.modules = inventoryImportAttrsetWithCheck;
}

View File

@@ -167,6 +167,7 @@ let
(builtins.fromJSON (builtins.readFile inventoryFile)) (builtins.fromJSON (builtins.readFile inventoryFile))
else else
{ }; { };
in in
{ {
imports = [ imports = [
@@ -189,7 +190,9 @@ in
inventory.machines = lib.mapAttrs (_n: _: { }) config.machines; inventory.machines = lib.mapAttrs (_n: _: { }) config.machines;
} }
# Merge the meta attributes from the buildClan function # Merge the meta attributes from the buildClan function
{ inventory.modules = clan-core.clanModules; } {
inventory.modules = clan-core.clanModules;
}
# config.inventory.meta <- config.meta # config.inventory.meta <- config.meta
{ inventory.meta = config.meta; } { inventory.meta = config.meta; }
# Set default for computed tags # Set default for computed tags