one flake containing all of my nixos configs
{
  config,
  pkgs,
  lib,
  ...
}: let
  cfg = config.dotfiles.shell.passhole;

  utils = import ../utils pkgs;
  swayPrefix = config.wayland.windowManager.sway.config.modifier;
  passhole = pkgs.callPackage ./passhole.nix {};
in {
  config = lib.mkIf cfg.enable {
    home.packages =
      [passhole]
      ++ (
        if cfg.swayIntegration.enable
        then [pkgs.bemenu]
        else []
      );
    xdg.configFile."passhole.ini".text = utils.mkINI {
      chris_shared = {
        default = true;
        database = "~/MEGAsync/keepass/chris_shared.kdbx";
        cache = "~/.cache/keepass_chris_shared_cache";
        cache-timeout = 2 * 60 * 60; # 2 hours
      };
    };

    wayland.windowManager.sway.config.keybindings = with pkgs; let
      bemenu_choose_passhole_entry = writeShellApplication {
        name = "bemenu_choose_passhole_entry";
        runtimeInputs = [bemenu coreutils passhole];
        text = "echo force_get_password_via_zenity | ph grep -i . | bemenu --ignorecase --center --margin 10 --list 10";
      };
      wlrctl_type_passhole_field_value = writeShellApplication {
        name = "wlrctl_type_passhole_field_value";
        runtimeInputs = [bemenu_choose_passhole_entry wlrctl];
        text = ''
          wlrctl keyboard type "$(ph show --field "$2" "$1")"
        '';
      };
      bemenu_choose_passhole_field = writeShellApplication {
        name = "bemenu_choose_passhole_field";
        runtimeInputs = [bemenu coreutils passhole gnused];
        # ph show needs the color codes and stuff stripped from it's output
        text = ''
          ph show "$1" \
            | sed 's/\x1B\[[0-9;]\{1,\}[A-Za-z]//g' \
            | cut -d : -f 1 \
            | bemenu --ignorecase --center --margin 10 --list 10
        '';
      };
    in
      lib.mkIf cfg.swayIntegration.enable {
        # adds a bemenu fuzzy finder, the password choice is typed out
        # via a virtual keyboard
        "${swayPrefix}+p" = let
          name = "wlrctl_type_passhole_password";
        in "exec ${writeShellApplication {
          inherit name;
          runtimeInputs = [bemenu_choose_passhole_entry wlrctl_type_passhole_field_value];
          text = ''wlrctl_type_passhole_field_value "$(bemenu_choose_passhole_entry)" password'';
        }}/bin/${name}";

        "${swayPrefix}+Shift+p" = let
          name = "wlrctl_type_passhole_password";
        in "exec ${writeShellApplication {
          inherit name;
          runtimeInputs = [bemenu_choose_passhole_entry wlrctl_type_passhole_field_value];
          text = ''wlrctl_type_passhole_field_value "$(bemenu_choose_passhole_entry)" username'';
        }}/bin/${name}";

        "${swayPrefix}+Ctrl+p" = let
          name = "wlrctl_type_passhole_arbitrary_field";
        in "exec ${writeShellApplication {
          inherit name;
          runtimeInputs = [bemenu_choose_passhole_entry bemenu_choose_passhole_field wlrctl_type_passhole_field_value];
          text = ''
            ENTRY="$(bemenu_choose_passhole_entry)"
            FIELD="$(bemenu_choose_passhole_field "$ENTRY")"
            wlrctl_type_passhole_field_value "$ENTRY" "$FIELD"
          '';
        }}/bin/${name}";
      };
  };
}