Merge pull request 'chore(buildClan): remove dependency on clan-core in the lib function' (#3167) from hsjobeki/clan-core:clan-services into main

Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/3167
This commit is contained in:
hsjobeki
2025-04-02 09:09:28 +00:00
8 changed files with 87 additions and 36 deletions

View File

@@ -11,9 +11,24 @@ let
inherit (lib) types; inherit (lib) types;
buildClanModule = clan-core.clanLib.buildClanModule; 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 in
{ {
options.clan = lib.mkOption { options.clan = lib.mkOption {
default = { }; default = { };
type = types.submoduleWith { type = types.submoduleWith {
@@ -27,16 +42,16 @@ in
}; };
}; };
options.flake = flake-parts-lib.mkSubmoduleOptions { options.flake =
clan = lib.mkOption { type = types.raw; }; flake-parts-lib.mkSubmoduleOptions {
clanInternals = lib.mkOption { type = types.raw; }; clan = lib.mkOption { type = types.raw; };
}; }
// outputModule.topLevel.options;
config = { config = {
flake.clan = { flake = {
inherit (config.clan.clanInternals) templates; clan = outputModule.clan;
}; } // outputModule.topLevel.config;
flake.clanInternals = config.clan.clanInternals;
flake.nixosConfigurations = config.clan.nixosConfigurations;
}; };
_file = __curPos.file; _file = __curPos.file;
} }

View File

@@ -44,15 +44,15 @@ Example filetree
```sh ```sh
. .
├── default.nix ├── default.nix
├── feature_foo ├── build-clan
│ ├── impl.nix │ ├── impl.nix
│ └── test.nix │ └── test.nix
└── feature_bar └── inventory
├── impl.nix ├── impl.nix
├── complex-subfeature ├── services-subfeature
│ ├── impl.nix │ ├── impl.nix
│ └── test.nix │ └── test.nix
├── testless-subfeature # <- We immediately see that this feature is not tested on itself. ├── instances-subfeature # <- We immediately see that this feature is not tested on itself.
│ └── impl.nix │ └── impl.nix
└── test.nix └── test.nix
``` ```

View File

@@ -23,7 +23,7 @@
{ name, ... }: { name, ... }:
{ {
tags = builtins.attrNames ( tags = builtins.attrNames (
lib.filterAttrs (_t: tagMemers: builtins.elem name tagMemers) config.inventory.tags lib.filterAttrs (_t: tagMembers: builtins.elem name tagMembers) config.inventory.tags
); );
} }
) )

View File

@@ -4,26 +4,37 @@
{ {
lib, lib,
nixpkgs, nixpkgs,
clan-core,
}: }:
let
clanResultAttributes = [
"clanInternals"
"nixosConfigurations"
];
in
{ {
inherit clanResultAttributes;
flakePartsModule = { flakePartsModule = {
imports = [ imports = [
./interface.nix ./interface.nix
./module.nix ./module.nix
]; ];
}; };
/** /**
Function that returns the same result as the correlated flake-parts module A function that takes some arguments such as 'clan-core' and returns the 'buildClan' function.
# 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
- inventory: An "Inventory" attribute set, see the docs, for how to construct one
- specialArgs: Extra arguments to pass to nixosSystem i.e. useful to make self available
- ...: Any other argument of the 'clan' submodule. See the docs for all available options
# Returns
Public attributes of buildClan. As specified in publicAttrs.
*/ */
buildClan = buildClanWith =
{
clan-core,
publicAttrs ? import ./public.nix,
}:
{ {
## Inputs ## Inputs
self ? lib.warn "Argument: 'self' must be set when using 'buildClan'." null, # Reference to the current flake self ? lib.warn "Argument: 'self' must be set when using 'buildClan'." null, # Reference to the current flake
@@ -33,7 +44,7 @@ in
# deadnix: skip # deadnix: skip
inventory ? { }, inventory ? { },
## Special inputs (not passed to the module system as config) ## Special inputs (not passed to the module system as config)
specialArgs ? { }, # Extra arguments to pass to nixosSystem i.e. useful to make self available # A set containing clan meta: name :: string, icon :: string, description :: string specialArgs ? { }, # Extra arguments to pass to nixosSystem i.e. useful to make self available
## ##
... ...
}@attrs: }@attrs:
@@ -48,12 +59,20 @@ in
inherit specialArgs; inherit specialArgs;
}; };
rest = builtins.removeAttrs attrs [ "specialArgs" ]; rest = builtins.removeAttrs attrs [ "specialArgs" ];
result = eval {
imports = [
rest
# implementation
./module.nix
];
};
in in
eval { {
imports = [ clan = lib.genAttrs publicAttrs.clan (
rest name:
# implementation result.clanInternals.${name}
./module.nix 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 # TODO: unify this interface
# We should have only clan.modules. (consistent with clan.templates) # We should have only clan.modules. (consistent with clan.templates)
inherit (clan-core) clanModules clanLib; inherit (clan-core) clanModules clanLib;
modules = clan-core.modules; modules = clan-core.clanModules;
inherit inventoryFile; inherit inventoryFile;
inventoryValuesPrios = 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"
];
}

View File

@@ -23,9 +23,8 @@ lib.fix (clanLib: {
buildClanModule = import ./build-clan { buildClanModule = import ./build-clan {
inherit lib nixpkgs; inherit lib nixpkgs;
clan-core = self;
}; };
buildClan = clanLib.buildClanModule.buildClan; buildClan = clanLib.buildClanModule.buildClanWith { clan-core = self; };
# ------------------------------------ # ------------------------------------
# Lib functions that don't depend on 'self' # Lib functions that don't depend on 'self'
inventory = clanLib.callLib ./inventory { }; inventory = clanLib.callLib ./inventory { };

View File

@@ -29,6 +29,7 @@ in
include = [ include = [
"flakeModules" "flakeModules"
"nixosModules" "nixosModules"
"lib"
]; ];
} }
}#legacyPackages.${system}.evalTests-module-clan-vars }#legacyPackages.${system}.evalTests-module-clan-vars