Unverified Commit 119d5fd4 authored by Adam C. Stephens's avatar Adam C. Stephens Committed by GitHub
Browse files

elephant: init at 2.19.2, nixos/elephant: init service (#483810)

parents 3efb0b8a 0e23c1af
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@

- [dsearch](https://github.com/AvengeMedia/danksearch), a fast filesystem search service with fuzzy matching. Available as [programs.dsearch](#opt-programs.dsearch.enable).

- [Elephant](https://github.com/abenz1267/elephant), a data provider service and backend for building custom application launchers. Available as [services.elephant](#opt-services.elephant.enable).

- [Dunst](https://github.com/dunst-project/dunst), a lightweight and customizable notification daemon. Available as [services.dunst](#opt-services.dunst.enable).

- [Ente Auth](https://ente.io/auth/), an open source 2FA authenticator, with end-to-end encrypted backups. Available as [programs.ente-auth](#opt-programs.ente-auth.enable).
+1 −0
Original line number Diff line number Diff line
@@ -843,6 +843,7 @@
  ./services/misc/dump1090-fa.nix
  ./services/misc/dwm-status.nix
  ./services/misc/dysnomia.nix
  ./services/misc/elephant.nix
  ./services/misc/errbot.nix
  ./services/misc/ersatztv.nix
  ./services/misc/etebase-server.nix
+37 −0
Original line number Diff line number Diff line
{
  config,
  lib,
  pkgs,
  ...
}:

let
  cfg = config.services.elephant;
in
{
  options.services.elephant = {
    enable = lib.mkEnableOption "Elephant application launcher backend";

    package = lib.mkPackageOption pkgs "elephant" { };
  };

  config = lib.mkIf cfg.enable {
    systemd.user.services.elephant = {
      description = "Elephant application launcher backend";
      wantedBy = [ "graphical-session.target" ];
      partOf = [ "graphical-session.target" ];
      after = [ "graphical-session.target" ];
      serviceConfig = {
        Restart = "always";
        RestartSec = 10;
        ExecStart = "${cfg.package}/bin/elephant";
      };
    };

    environment.systemPackages = [ cfg.package ];
  };

  meta.maintainers = with lib.maintainers; [
    saadndm
  ];
}
+131 −0
Original line number Diff line number Diff line
{
  enableArchLinuxPkgs ? false,
  enableDnfPackages ? false,
  enable1password ? false,
  enableBitwarden ? true,
  enableBluetooth ? true,
  enableBookmarks ? true,
  enableCalc ? true,
  enableClipboard ? true,
  enableDesktopApplications ? true,
  enableFiles ? true,
  enableMenus ? true,
  enableNiriActions ? true,
  enableNiriSessions ? true,
  enableProviderList ? true,
  enableRunner ? true,
  enableSnippets ? true,
  enableSymbols ? true,
  enableTodo ? true,
  enableUnicode ? true,
  enableWebsearch ? true,
  enableWindows ? true,

  bluez,
  buildGoModule,
  fd,
  fetchFromGitHub,
  imagemagick,
  lib,
  libqalculate,
  makeWrapper,
  nix-update-script,
  protobuf,
  protoc-gen-go,
  wl-clipboard,
}:
let
  providerMap = {
    "1password" = enable1password;
    "archlinuxpkgs" = enableArchLinuxPkgs;
    "bitwarden" = enableBitwarden;
    "bluetooth" = enableBluetooth;
    "bookmarks" = enableBookmarks;
    "calc" = enableCalc;
    "clipboard" = enableClipboard;
    "desktopapplications" = enableDesktopApplications;
    "dnfpackages" = enableDnfPackages;
    "files" = enableFiles;
    "menus" = enableMenus;
    "niriactions" = enableNiriActions;
    "nirisessions" = enableNiriSessions;
    "providerlist" = enableProviderList;
    "runner" = enableRunner;
    "snippets" = enableSnippets;
    "symbols" = enableSymbols;
    "todo" = enableTodo;
    "unicode" = enableUnicode;
    "websearch" = enableWebsearch;
    "windows" = enableWindows;
  };

  enabledProviders = lib.filterAttrs (_: enabled: enabled) providerMap;
  enabledProvidersList = lib.concatStringsSep " " (lib.attrNames enabledProviders);

  runtimeDeps =
    lib.optionals enableFiles [ fd ]
    ++ lib.optionals enableBluetooth [ bluez ]
    ++ lib.optionals enableCalc [ libqalculate ]
    ++ lib.optionals enableClipboard [
      wl-clipboard
      imagemagick
    ];

in
buildGoModule (finalAttrs: {
  pname = "elephant";
  version = "2.19.2";

  src = fetchFromGitHub {
    owner = "abenz1267";
    repo = "elephant";
    rev = "v${finalAttrs.version}";
    hash = "sha256-hs1Re7ltWYFBsiwDsK3Qb3/KgZ4E2HY7cFB/M8JWSu4=";
  };

  vendorHash = "sha256-tO+5x2FIY1UBvWl9x3ZSpHwTWUlw1VNDTi9+2uY7xdU=";

  buildInputs = [ protobuf ];
  nativeBuildInputs = [
    makeWrapper
    protoc-gen-go
  ];

  subPackages = [ "cmd/elephant" ];

  postBuild = ''
    echo "Building providers: ${enabledProvidersList}"

    mkdir -p $out/lib/elephant/providers
    for provider in ${enabledProvidersList}; do
      [ -z "$provider" ] && continue
      if [ -d "internal/providers/$provider" ]; then
        echo "Building provider: $provider"
        go build -buildmode=plugin -o "$out/lib/elephant/providers/$provider.so" ./internal/providers/"$provider" || exit 1
      fi
    done
  '';

  postInstall = ''
    wrapProgram $out/bin/elephant \
      --prefix PATH : ${lib.makeBinPath runtimeDeps} \
      --set ELEPHANT_PROVIDER_DIR "$out/lib/elephant/providers"
  '';

  passthru = {
    updateScript = nix-update-script { };
  };

  meta = {
    description = "Data provider service and backend for building custom application launchers";
    changelog = "https://github.com/abenz1267/elephant/releases/tag/v${finalAttrs.version}";
    homepage = "https://github.com/abenz1267/elephant";
    license = lib.licenses.gpl3Only;
    platforms = lib.platforms.linux;
    maintainers = with lib.maintainers; [
      adamcstephens
      saadndm
    ];
    mainProgram = "elephant";
  };
})