home-manager/modules/services/fnott.nix
polykernel 46a69810cb
fnott: remove global properties generation
Rationale:

As of release 1.1.2[1], the configuration ini file supports
declaration of the `[main]` header as an alternative to global
properties by enumerating all sections and mapping each to the
respective parsing function. Global properties will still be parsed
correctly by fnott however generation adds unnecessary complexity to
the module. This commit removes the need for global properties
generation.

Changes:

- Fixed the FIXME at L118.

- Cleaned up unneeded let bindings.

- Changed the generation method to use the `pkgs.formats.ini` from
  pkgs-lib instead of the raw `generators` library. This was done for
  consistency and clarity as the `pkgs.formats.ini` is still required
  for type declaration and uses `generators` internally.

- Removed `global-properties` testcase.

- Updated `example-settings` testcase.

[1] - https://codeberg.org/dnkl/fnott/releases/tag/1.1.2
2021-10-27 00:01:57 +02:00

112 lines
3.3 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.fnott;
concatStringsSep' = sep: list:
concatStringsSep sep (filter (x: x != "") list);
iniFormat = pkgs.formats.ini { };
in {
options = {
services.fnott = {
enable = mkEnableOption ''
fnott, a lightweight Wayland notification daemon for wlroots-based compositors
'';
package = mkOption {
type = types.package;
default = pkgs.fnott;
defaultText = literalExpression "pkgs.fnott";
description = "Package providing <command>fnott</command>.";
};
extraFlags = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "-s" ];
description = ''
Extra arguments to use for executing fnott.
'';
};
configFile = mkOption {
type = types.either types.str types.path;
default = "${config.xdg.configHome}/fnott/fnott.ini";
defaultText = "$XDG_CONFIG_HOME/fnott/fnott.ini";
description = ''
Path to the configuration file read by fnott.
</para><para>
Note that environment variables in the path won't be properly expanded.
</para><para>
The configuration specified under
<option>services.fnott.settings</option> will be generated and
written to <filename>$XDG_CONFIG_HOME/fnott/fnott.ini</filename>
regardless of this option. This allows using a mutable configuration file
generated from the immutable one, useful in scenarios where live reloading is desired.
'';
};
settings = mkOption {
type = iniFormat.type;
default = { };
description = ''
Configuration written to
<filename>$XDG_CONFIG_HOME/fnott/fnott.ini</filename>.
</para><para>
See
<citerefentry>
<refentrytitle>fnott.ini</refentrytitle>
<manvolnum>5</manvolnum>
</citerefentry> for a list of avaliable options and <link
xlink:href="https://codeberg.org/dnkl/fnott/src/branch/master/fnott.ini"/>
for an example configuration.
'';
example = literalExpression ''
{
main = {
notification-margin = 5;
};
low = {
timeout = 5;
title-font = "Dina:weight=bold:slant=italic";
title-color = "ffffff";
};
}
'';
};
};
};
config = mkIf cfg.enable {
assertions =
[ (hm.assertions.assertPlatform "services.fnott" pkgs platforms.linux) ];
home.packages = [ cfg.package ];
systemd.user.services.fnott = {
Unit = {
Description = "Fnott notification daemon";
Documentation = "man:fnott(1)";
After = [ "graphical-session-pre.target" ];
PartOf = [ "graphical-session.target" ];
};
Service = {
Type = "dbus";
BusName = "org.freedesktop.Notifications";
ExecStart = concatStringsSep' " " [
"${cfg.package}/bin/fnott"
"-c ${escapeShellArg cfg.configFile}"
(escapeShellArgs cfg.extraFlags)
];
};
};
xdg.configFile."fnott/fnott.ini".source =
iniFormat.generate "fnott.ini" cfg.settings;
};
}