diff --git a/modules/services/ludusavi.nix b/modules/services/ludusavi.nix index 1e706c64d..c1f5a6261 100644 --- a/modules/services/ludusavi.nix +++ b/modules/services/ludusavi.nix @@ -1,31 +1,50 @@ -{ config, lib, pkgs, ... }: +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib) + getExe + maintainers + mkEnableOption + mkIf + mkOption + ; + + inherit (lib.types) + bool + nullOr + path + ; + cfg = config.services.ludusavi; settingsFormat = pkgs.formats.yaml { }; - configFile = if cfg.configFile == null then - settingsFormat.generate "config.yaml" cfg.settings - else - cfg.configFile; -in { - meta.maintainers = [ lib.maintainers.PopeRigby ]; + configFile = + if cfg.configFile == null then + settingsFormat.generate "config.yaml" cfg.settings + else + cfg.configFile; +in +{ options.services.ludusavi = { - enable = lib.mkEnableOption "Ludusavi game backup tool"; - configFile = lib.mkOption { - type = with lib.types; nullOr path; + enable = mkEnableOption "Ludusavi game backup tool"; + configFile = mkOption { + type = nullOr path; default = null; description = '' Path to a Ludusavi `config.yaml`. Mutually exclusive with the `settings` option. - See https://github.com/mtkennerly/ludusavi#configuration-file for available options. + See https://github.com/mtkennerly/ludusavi/blob/master/docs/help/configuration-file.md for available options. ''; }; - settings = lib.mkOption { + settings = mkOption { type = settingsFormat.type; default = { - manifest.url = - "https://raw.githubusercontent.com/mtkennerly/ludusavi-manifest/master/data/manifest.yaml"; + manifest.url = "https://raw.githubusercontent.com/mtkennerly/ludusavi-manifest/master/data/manifest.yaml"; roots = [ ]; backup.path = "$XDG_STATE_HOME/backups/ludusavi"; restore.path = "$XDG_STATE_HOME/backups/ludusavi"; @@ -33,10 +52,12 @@ in { example = { language = "en-US"; theme = "light"; - roots = [{ - path = "~/.local/share/Steam"; - store = "steam"; - }]; + roots = [ + { + path = "~/.local/share/Steam"; + store = "steam"; + } + ]; backup.path = "~/.local/state/backups/ludusavi"; restore.path = "~/.local/state/backups/ludusavi"; }; @@ -46,22 +67,34 @@ in { for available options. ''; }; + backupNotification = mkOption { + type = bool; + default = false; + description = '' + Send a notification message after a successful backup. + ''; + }; }; - config = lib.mkIf cfg.enable { - assertions = [{ - assertion = (cfg.settings != { }) != (cfg.configFile != null); - message = - "The `settings` and `configFile` options are mutually exclusive."; - }]; + config = mkIf cfg.enable { + assertions = [ + { + assertion = (cfg.settings != { }) != (cfg.configFile != null); + message = "The `settings` and `configFile` options are mutually exclusive."; + } + ]; systemd.user = { services.ludusavi = { Unit.Description = "Run a game save backup with Ludusavi"; - Service = { - Type = "oneshot"; - ExecStart = "${pkgs.ludusavi}/bin/ludusavi backup --force"; - }; + Service = + { + Type = "oneshot"; + ExecStart = "${getExe pkgs.ludusavi} backup --force"; + } + // lib.optionalAttrs cfg.backupNotification { + ExecStartPost = "${getExe pkgs.libnotify} 'Ludusavi' 'Backup completed' -i com.github.mtkennerly.ludusavi -a 'Ludusavi'"; + }; }; timers.ludusavi = { Unit.Description = "Run a game save backup with Ludusavi, daily"; @@ -74,4 +107,6 @@ in { home.packages = [ pkgs.ludusavi ]; }; + + meta.maintainers = [ maintainers.PopeRigby ]; }