Files
snowfall-lib/snowfall-lib/overlay/default.nix
2025-10-08 21:24:21 -05:00

199 lines
6.1 KiB
Nix

{
core-inputs,
user-inputs,
snowfall-lib,
snowfall-config,
}: let
inherit (core-inputs.nixpkgs.lib) assertMsg foldl concatStringsSep;
user-overlays-root = snowfall-lib.fs.get-snowfall-file "overlays";
user-packages-root = snowfall-lib.fs.get-snowfall-file "packages";
in {
overlay = {
## Create a flake-utils-plus overlays builder.
## Example Usage:
## ```nix
## create-overlays { src = ./my-overlays; namespace = "my-packages"; }
## ```
## Result:
## ```nix
## (channels: [ ... ])
## ```
#@ Attrs -> Attrs -> [(a -> b -> c)]
create-overlays-builder = {
src ? user-overlays-root,
namespace ? snowfall-config.namespace,
extra-overlays ? [],
}: channels: let
user-overlays = snowfall-lib.fs.get-default-nix-files-recursive src;
create-overlay = overlay:
import overlay (
# Deprecated: Use `inputs.*` instead of referencing the input name directly.
user-inputs
// {
inherit channels;
inherit (snowfall-config) namespace;
inputs = user-inputs;
lib = snowfall-lib.internal.system-lib;
}
);
user-packages-overlay = final: prev: let
user-packages = snowfall-lib.package.create-packages {
pkgs = final;
inherit channels namespace;
};
in {
${namespace} =
(prev.${namespace} or {})
// user-packages;
};
overlays =
[user-packages-overlay] ++ extra-overlays ++ (builtins.map create-overlay user-overlays);
in
overlays;
## Create exported overlays from the user flake. Adapted [from flake-utils-plus](https://github.com/gytis-ivaskevicius/flake-utils-plus/blob/2bf0f91643c2e5ae38c1b26893ac2927ac9bd82a/lib/exportOverlays.nix).
##
## Example Usage:
## ```nix
## create-overlays { src = ./my-overlays; packages-src = ./my-packages; namespace = "my-namespace"; extra-overlays = {}; }
## ```
## Result:
## ```nix
## { default = final: prev: ...; some-overlay = final: prev: ...; }
## ```
#@ Attrs -> Attrs
create-overlays = {
src ? user-overlays-root,
packages-src ? user-packages-root,
namespace ? snowfall-config.namespace,
extra-overlays ? {},
}: let
fake-pkgs = {
callPackage = x: x;
isFakePkgs = true;
lib = {};
system = "fake-system";
};
user-overlays = snowfall-lib.fs.get-default-nix-files-recursive src;
channel-systems = user-inputs.self.pkgs;
user-packages-overlay = final: prev: let
user-packages = snowfall-lib.package.create-packages {
pkgs = final;
channels = channel-systems.${prev.system};
inherit namespace;
};
in
if namespace == null
then user-packages
else {
${namespace} =
(prev.${namespace} or {})
// user-packages;
};
create-overlay = (
overlays: file: let
name = builtins.unsafeDiscardStringContext (snowfall-lib.path.get-parent-directory file);
overlay = final: prev: let
channels = channel-systems.${prev.system};
user-overlay = import file (
# Deprecated: Use `inputs.*` instead of referencing the input name directly.
user-inputs
// {
inherit channels namespace;
inputs = user-inputs;
lib = snowfall-lib.internal.system-lib;
}
);
packages = user-packages-overlay final prev;
prev-with-packages =
if namespace == null
then prev // packages
else
prev
// {
${namespace} =
(prev.${namespace} or {})
// packages.${namespace};
};
user-overlay-packages =
user-overlay
final
prev-with-packages;
outputs =
user-overlay-packages;
in
if user-overlay-packages.__dontExport or false == true
then outputs // {__dontExport = true;}
else outputs;
fake-overlay-result = overlay fake-pkgs fake-pkgs;
in
if fake-overlay-result.__dontExport or false == true
then overlays
else
overlays
// {
${name} = overlay;
}
);
overlays =
foldl
create-overlay
{}
user-overlays;
user-packages = snowfall-lib.fs.get-default-nix-files-recursive packages-src;
create-package-overlay = package-overlays: file: let
name = builtins.unsafeDiscardStringContext (snowfall-lib.path.get-parent-directory file);
overlay = final: prev: let
channels = channel-systems.${prev.system};
packages = snowfall-lib.package.create-packages {
inherit namespace;
channels = channel-systems.${prev.system};
};
in
if namespace == null
then {${name} = packages.${name};}
else {
${namespace} =
(prev.${namespace} or {})
// {${name} = packages.${name};};
};
in
package-overlays
// {
"package/${name}" = overlay;
};
package-overlays =
foldl
create-package-overlay
{}
user-packages;
default-overlay = final: prev: let
overlays-list = builtins.attrValues overlays;
package-overlays-list = builtins.attrValues package-overlays;
overlays-results = builtins.map (overlay: overlay final prev) overlays-list;
package-overlays-results = builtins.map (overlay: overlay final prev) package-overlays-list;
merged-results =
snowfall-lib.attrs.merge-shallow-packages
(package-overlays-results ++ overlays-results);
in
merged-results;
in
package-overlays
// overlays
// {default = default-overlay;}
// extra-overlays;
};
}