From 1066e01707763381ee27e9e1b9758244b3661a4c Mon Sep 17 00:00:00 2001 From: AstroSnail Date: Sun, 6 Sep 2020 18:04:07 +0000 Subject: [PATCH] mpv: use lib.generators to render config There exist mpv configurations which cannot be expressed in `programs.mpv.config` currently. For example, it is impossible to use multiple 'profile' attributes. This commit changes the way config and profiles are parsed, using `lib.generators.toKeyValue` and `lib.generators.toINI`, to allow for these kinds of configurations through the use of `listsAsDuplicateKeys`. --- modules/programs/mpv.nix | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/modules/programs/mpv.nix b/modules/programs/mpv.nix index 7c15bd9e..5901f9d0 100644 --- a/modules/programs/mpv.nix +++ b/modules/programs/mpv.nix @@ -8,7 +8,8 @@ let cfg = config.programs.mpv; mpvOption = with types; either str (either int (either bool float)); - mpvOptions = with types; attrsOf mpvOption; + mpvOptionDup = with types; either mpvOption (listOf mpvOption); + mpvOptions = with types; attrsOf mpvOptionDup; mpvProfiles = with types; attrsOf mpvOptions; mpvBindings = with types; attrsOf str; @@ -22,18 +23,23 @@ let string = option; }.${typeOf option}; - renderOptions = options: - concatStringsSep "\n" (mapAttrsToList (name: value: - let - rendered = renderOption value; - length = toString (stringLength rendered); - in "${name}=%${length}%${rendered}") options); + renderOptionValue = value: + let + rendered = renderOption value; + length = toString (stringLength rendered); + in "%${length}%${rendered}"; - renderProfiles = profiles: - concatStringsSep "\n" (mapAttrsToList (name: value: '' - [${name}] - ${renderOptions value} - '') profiles); + renderOptions = generators.toKeyValue { + mkKeyValue = + generators.mkKeyValueDefault { mkValueString = renderOptionValue; } "="; + listsAsDuplicateKeys = true; + }; + + renderProfiles = generators.toINI { + mkKeyValue = + generators.mkKeyValueDefault { mkValueString = renderOptionValue; } "="; + listsAsDuplicateKeys = true; + }; renderBindings = bindings: concatStringsSep "\n"