{ config, pkgs, lib, ... }: let cfg = config.local.services.lan-mouse; connectionSettings = with lib; (types.submodule { options = { hostname = mkOption { type = types.str; default = ""; }; ips = mkOption { type = types.listOf types.str; default = [ ]; }; port = mkOption { type = types.int; default = 4242; }; activateOnStartup = mkOption { type = types.bool; default = false; }; }; }); inherit (builtins) concatStringsSep; # See: https://github.com/feschber/lan-mouse/blob/main/src/config.rs#L79 lanMouseConfig = pkgs.writeText "config.toml" ( let # List[str] -> str listOfStr = l: concatStringsSep "," (map (val: "\"${val}\"") l); in '' port = ${toString cfg.settings.port} frontent = "${cfg.settings.frontend}" '' + lib.optionalString (cfg.settings.releaseBind != [ ]) '' release_bind = [${listOfStr cfg.settings.releaseBind}] '' + (concatStringsSep "\n" (lib.attrValues (lib.mapAttrs (key: value: '' [${key}] ips = [${listOfStr value.ips}] ${lib.optionalString (value.hostname != "") '' hostname = "${value.hostname}" ''} port = ${toString value.port} activate_on_startup = ${if value.activateOnStartup then "true" else "false"} '' ) cfg.settings.connections ) ) ) ); in { options.local.services.lan-mouse = with lib; { enable = mkEnableOption "lan-mouse"; settings = { releaseBind = mkOption { type = types.listOf types.str; default = [ ]; }; frontend = mkOption { type = types.enum [ "cli" "gtk" ]; default = "gtk"; }; port = mkOption { type = types.int; default = 4242; }; connections = mkOption { type = types.attrsOf connectionSettings; default = { }; }; }; }; config = lib.mkIf cfg.enable { programs.lan-mouse = { enable = true; # systemd = true; package = pkgs.unstable.lan-mouse; }; xdg.configFile."lan-mouse/config.toml".source = lanMouseConfig; }; }