flk 0.6.3

A CLI tool for managing flake.nix devShell environments
Documentation
{
  nixpkgs,
  flake-utils,
  profile-lib,
}: {
  src,
  systems ? null,
  nixpkgsOverride ? null,
}: _inputs: let
  np =
    if nixpkgsOverride != null
    then nixpkgsOverride
    else nixpkgs;
  lib = np.lib;

  configPath = src + "/config.nix";
  config =
    if builtins.pathExists configPath
    then import configPath
    else {};
  defaultProfile = config.defaultProfile or "";
  maxCombinations = config.maxCombinations or 3;

  eachSystem =
    if systems == null
    then flake-utils.lib.eachDefaultSystem
    else flake-utils.lib.eachSystem systems;

  pinsPath = src + "/pins.nix";
  pinsData =
    if builtins.pathExists pinsPath
    then import pinsPath
    else {
      sources = {};
      pinnedPackages = {};
    };
  pins = pinsData.sources or {};
  pinnedPackages = pinsData.pinnedPackages or {};

  fetchPin = ref: builtins.getFlake ref;

  profilesDir = src + "/profiles";
in
  eachSystem (
    system: let
      rustOverlayList =
        if pins ? rust-overlay
        then [(fetchPin pins.rust-overlay).overlays.default]
        else [];

      createPinnedOverlays = pp:
        builtins.map (
          pinName: let
            pkgDefs = pp.${pinName};
            pinnedPkgs = (fetchPin pins.${pinName}).legacyPackages.${system};
          in
            _final: _prev:
              builtins.listToAttrs (
                builtins.map (pkgDef: {
                  name = pkgDef.name;
                  value = pinnedPkgs.${pkgDef.pkg};
                })
                pkgDefs
              )
        ) (builtins.attrNames pp);

      overlays = rustOverlayList ++ (createPinnedOverlays pinnedPackages);

      pkgs = import np {
        inherit system overlays;
      };

      profileLib = profile-lib.lib {inherit pkgs;};

      profileFiles = builtins.readDir profilesDir;
      profileDefinitions = builtins.listToAttrs (
        map (file: {
          name = lib.removeSuffix ".nix" file;
          value = import (profilesDir + "/${file}") {inherit pkgs system;};
        })
        (builtins.filter
          (n: n != "default.nix" && lib.hasSuffix ".nix" n)
          (builtins.attrNames profileFiles))
      );
    in
      profileLib.mkProfileOutputs {
        inherit profileDefinitions maxCombinations;
      }
      // lib.optionalAttrs (defaultProfile != "") {defaultShell = defaultProfile;}
  )