chore(buildClan): make buildClan and flake-parts return identical outputs

This commit is contained in:
Johannes Kirschbauer
2025-04-01 17:28:52 +02:00
parent be62c8844e
commit d69a074366
4 changed files with 64 additions and 30 deletions

View File

@@ -11,9 +11,24 @@ let
inherit (lib) types;
buildClanModule = clan-core.clanLib.buildClanModule;
publicAttrs = import ../lib/build-clan/public.nix;
# Create output options only for listed attributes
outputModule = {
clan = lib.genAttrs publicAttrs.clan (
name:
config.clan.clanInternals.${name}
or (throw "Output: clanInternals.${name} not found. Check: ${config.file}")
);
topLevel = {
options = lib.genAttrs publicAttrs.topLevel (_: lib.mkOption { });
config = lib.genAttrs publicAttrs.topLevel (
name: config.clan.${name} or (throw "Output: clan.${name} not found. See: ${config.file}")
);
};
};
in
{
options.clan = lib.mkOption {
default = { };
type = types.submoduleWith {
@@ -27,16 +42,16 @@ in
};
};
options.flake = flake-parts-lib.mkSubmoduleOptions {
clan = lib.mkOption { type = types.raw; };
clanInternals = lib.mkOption { type = types.raw; };
};
options.flake =
flake-parts-lib.mkSubmoduleOptions {
clan = lib.mkOption { type = types.raw; };
}
// outputModule.topLevel.options;
config = {
flake.clan = {
inherit (config.clan.clanInternals) templates;
};
flake.clanInternals = config.clan.clanInternals;
flake.nixosConfigurations = config.clan.nixosConfigurations;
flake = {
clan = outputModule.clan;
} // outputModule.topLevel.config;
};
_file = __curPos.file;
}

View File

@@ -5,14 +5,7 @@
lib,
nixpkgs,
}:
let
clanResultAttributes = [
"clanInternals"
"nixosConfigurations"
];
in
{
inherit clanResultAttributes;
flakePartsModule = {
imports = [
./interface.nix
@@ -25,6 +18,7 @@ in
# Arguments of the first function
- clan-core: Self, provided by our flake-parts module
- publicAttrs: { clan :: List Str, topLevel :: List Str } Publicly exported attribute names
# Arguments of the second function (aka 'buildClan')
- self: Reference to the users flake
@@ -34,13 +28,13 @@ in
# Returns
A module evaluation containing '.config' and '.options'
NOTE:
The result might export all kinds of options at the '.config' top level.
Public attributes of buildClan. As specified in publicAttrs.
*/
buildClanWith =
{ clan-core }:
{
clan-core,
publicAttrs ? import ./public.nix,
}:
{
## Inputs
self ? lib.warn "Argument: 'self' must be set when using 'buildClan'." null, # Reference to the current flake
@@ -65,12 +59,20 @@ in
inherit specialArgs;
};
rest = builtins.removeAttrs attrs [ "specialArgs" ];
result = eval {
imports = [
rest
# implementation
./module.nix
];
};
in
eval {
imports = [
rest
# implementation
./module.nix
];
};
{
clan = lib.genAttrs publicAttrs.clan (
name:
result.clanInternals.${name}
or (throw "Output: clanInternals.${name} not found. Check: ${result.file}")
);
}
// lib.filterAttrs (name: _v: builtins.elem name publicAttrs.topLevel) result;
}

View File

@@ -208,7 +208,7 @@ in
# TODO: unify this interface
# We should have only clan.modules. (consistent with clan.templates)
inherit (clan-core) clanModules clanLib;
modules = clan-core.modules;
modules = clan-core.clanModules;
inherit inventoryFile;
inventoryValuesPrios =

17
lib/build-clan/public.nix Normal file
View File

@@ -0,0 +1,17 @@
/**
Publicly exported attribute names
These are mapped from 'options.clan.{name}' into 'flake.{name}'
For example "clanInternals" will be exposed as "flake.clan.clanInternals"
This list is used to guarantee equivalent attribute sets for both flake-parts and buildClan users.
*/
{
# flake.clan.{name} <- clanInternals.{name}
clan = [
"templates"
];
# flake.{name} <- clan.{name}
topLevel = [
"clanInternals"
"nixosConfigurations"
];
}