bonfire/lib/default.nix
L-Nafaryus a4d8f5232e
Some checks failed
nix / check (push) Failing after 1m15s
flake: huge rework
flake: fix name conventions
flake: configurations -> lib.preconfiguredModules
flake.packages: rework platform dependency with convient module and
evaluator `lib.collectPackages`
packages.bonfire-docs: convient evaluators `nixosModulesDoc` and
`packagesDoc`
new: packages.postgresql: container image
new: packages.redis: container image
remove: packages.lego: needed dns provider was added to lego and nixpkgs
packages.netgen: broken
2024-07-18 15:49:05 +05:00

98 lines
2.9 KiB
Nix

{lib, ...}: rec {
maintainers = import ./maintainers.nix;
nameFromPath = path:
if builtins.baseNameOf (toString path) == "default.nix"
then builtins.baseNameOf (lib.removeSuffix "/default.nix" (toString path))
else builtins.baseNameOf (lib.removeSuffix ".nix" (toString path));
preconfiguredModules = lib.listToAttrs (map (path: {
name = nameFromPath path;
value = import path;
})
[
./preconfiguredModules/bonvim.nix
]);
isBroken = derivation: derivation ? meta && derivation.meta ? broken && derivation.meta.broken;
functionType = lib.types.mkOptionType {
name = "function";
check = value: builtins.isFunction value;
};
platformType = lib.types.mkOptionType {
name = "platform";
check = value: builtins.isString value && lib.any (v: v == value) lib.platforms.all;
};
packageType = with lib;
types.submodule {
options = {
source = mkOption {
type = types.oneOf [types.path functionType];
description = "Path to file with expression to build derivation or expression";
};
platforms = mkOption {
type = types.listOf platformType;
description = "List of supported platforms";
};
builder = mkOption {
type = functionType;
description = "Function with platform specific inputs that call final build function";
example = "{pkgs, ...}: pkgs.callPackage";
};
extraArgs = mkOption {
type = types.attrs;
default = {};
description = "Extra arguments passed to builder inputs. Platform is not configured for this arguments";
};
};
};
packagesModuleOptions = {...}:
with lib; {
options = {
packages = mkOption {
type = types.attrsOf packageType;
default = {};
description = "Set of defined packages";
};
};
};
collectPackages = platformInputs: packagesAttrs: let
packages =
(lib.evalModules {
modules = [
packagesModuleOptions
({...}: {
packages = packagesAttrs;
})
];
})
.config
.packages;
packagesList = lib.attrsToList packages;
evaluateDerivation = system: name: package: let
platInputs =
if functionType.check platformInputs
then (platformInputs system) // package.extraArgs
else throw "`plaformInputs` must be a function: `system` -> {...}";
platformBuilder = package.builder platInputs;
derivation = platformBuilder package.source platInputs;
in {${name} = derivation;};
evaluatedPackages = map ({
name,
value,
}:
lib.genAttrs value.platforms (
system: evaluateDerivation system name value
))
packagesList;
in
lib.mapAttrs (name: value: lib.mergeAttrsList value) (lib.zipAttrs evaluatedPackages);
}