{ config, lib, ... }:

# See also: ./nur-and-unstable.nix to allow unfree packages from "unstable".
# See also: ./base.nix for unfree firmware.

# This file adds the ability to whitelist unfree packages in different .nix config files.
# See https://github.com/NixOS/nixpkgs/issues/55674#issuecomment-1220216445 for why this is necessary.
# Example: Instead of
#   nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
#     "obsidian"
#   ];
# add the following
#   allowUnfree = [ "obsidian" ];

# Source:
# https://discourse.nixos.org/t/use-nixpkgs-config-allowunfreepredicate-in-multiple-nix-file/36590/2
# -> Implementation: https://codeberg.org/AndrewKvalheim/configuration/src/commit/11794e595144500a6c2be706e42ed698b1788bb8/packages/nixpkgs-issue-55674.nix
# -> Example: https://codeberg.org/AndrewKvalheim/configuration/src/commit/11794e595144500a6c2be706e42ed698b1788bb8/common/components/printer.system.nix#L7

# TODO: Once https://github.com/NixOS/nixpkgs/issues/55674 is merged, this is obsolete.

let
  inherit (builtins) elem;
  inherit (lib) getName mkOption;
  inherit (lib.types) listOf str;
in
{
  options.allowUnfree = mkOption { type = listOf str; default = [ ]; };
  config.nixpkgs.config.allowUnfreePredicate = p: elem (getName p) config.allowUnfree;
}
