80 lines
2.2 KiB
Nix
80 lines
2.2 KiB
Nix
{
|
|
nixosOptionsDoc,
|
|
lib,
|
|
pkgs,
|
|
clan-core,
|
|
...
|
|
}:
|
|
let
|
|
inherit (clan-core.clanLib.docs) stripStorePathsFromDeclarations;
|
|
transformOptions = stripStorePathsFromDeclarations;
|
|
|
|
nixosConfigurationWithClan =
|
|
let
|
|
evaled = lib.evalModules {
|
|
class = "nixos";
|
|
modules = [
|
|
# Basemodule
|
|
(
|
|
{ config, ... }:
|
|
{
|
|
imports = (import (pkgs.path + "/nixos/modules/module-list.nix"));
|
|
nixpkgs.pkgs = pkgs;
|
|
clan.core.name = "dummy";
|
|
system.stateVersion = config.system.nixos.release;
|
|
# Set this to work around a bug where `clan.core.settings.machine.name`
|
|
# is forced due to `networking.interfaces` being forced
|
|
# somewhere in the nixpkgs options
|
|
facter.detected.dhcp.enable = lib.mkForce false;
|
|
}
|
|
)
|
|
{
|
|
clan.core.settings.directory = clan-core;
|
|
}
|
|
clan-core.nixosModules.clanCore
|
|
];
|
|
};
|
|
in
|
|
evaled;
|
|
in
|
|
{
|
|
# Test with:
|
|
# nix build .\#legacyPackages.x86_64-linux.clanModulesViaService
|
|
clanModulesViaService = lib.mapAttrs (
|
|
_moduleName: moduleValue:
|
|
let
|
|
evaluatedService = clan-core.clanLib.evalService {
|
|
modules = [ moduleValue ];
|
|
prefix = [ ];
|
|
};
|
|
in
|
|
{
|
|
roles = lib.mapAttrs (
|
|
_roleName: role:
|
|
(nixosOptionsDoc {
|
|
transformOptions =
|
|
opt:
|
|
let
|
|
# Apply store path stripping first
|
|
transformed = transformOptions opt;
|
|
in
|
|
if lib.strings.hasPrefix "_" transformed.name then
|
|
transformed // { visible = false; }
|
|
else
|
|
transformed;
|
|
options = (lib.evalModules { modules = [ role.interface ]; }).options;
|
|
warningsAreErrors = true;
|
|
}).optionsJSON
|
|
) evaluatedService.config.roles;
|
|
manifest = evaluatedService.config.manifest;
|
|
}
|
|
) clan-core.clan.modules;
|
|
|
|
clanCore =
|
|
(nixosOptionsDoc {
|
|
options = nixosConfigurationWithClan.options.clan.core;
|
|
warningsAreErrors = true;
|
|
inherit transformOptions;
|
|
}).optionsJSON;
|
|
}
|