DRYing out repetitive configs?

Hi folks, newbie to both nixos and functional languages in general. I’m having trouble DRYing out some repetitive configs:

    firejail = {
      enable = true;
      wrappedBinaries = {
        firefox = {
          executable = "${lib.getBin pkgs.firefox}/bin/firefox";
          profile = "${pkgs.firejail}/etc/firejail/firefox.profile";
        };
        slack = {
          executable = "${lib.getBin pkgs.slack}/bin/slack";
          profile = "${pkgs.firejail}/etc/firejail/slack.profile";
        };
        thunderbird = {
          executable = "${lib.getBin pkgs.thunderbird}/bin/thunderbird";
          profile = "${pkgs.firejail}/etc/firejail/thunderbird.profile";
        };
      };
    };

I’m having trouble dynamically calling pkgs.${somePackageFromAList}. What’s the “right” way to refactor this? Thanks!

How about this:

firejail =
  let
    inherit (lib)
      genAttrs
    ;

    packageNames = [
      "firefox"
      "slack"
      "thunderbird"
    ];
  in
  {
    enable = true;
    wrappedBinaries = genAttrs packageNames (packageName: 
      {
        executable = "${lib.getBin pkgs.${packageName}}/bin/${packageName}";
        profile = "${pkgs.firejail}/etc/firejail/${packageName}.profile";
      }
    );
  }
4 Likes

Oh this is perfect! Thank you so much! genAttrs looks super useful.