1
0
Fork 0
mirror of https://github.com/nix-community/home-manager synced 2024-11-24 03:59:46 +01:00

lib: use generators from Nixpkgs

(cherry picked from commit 61042c7606)
This commit is contained in:
Robert Helgesson 2017-09-21 13:18:33 +02:00
parent 4b09df1809
commit 21a4dedd6f
No known key found for this signature in database
GPG key ID: C3DB11069E65DC86
5 changed files with 9 additions and 102 deletions

View file

@ -1,93 +0,0 @@
/* Functions that generate widespread file
* formats from nix data structures.
*
* They all follow a similar interface:
* generator { config-attrs } data
*
* Tests can be found in ./tests.nix
* Documentation in the manual, #sec-generators
*/
with import <nixpkgs/lib/trivial.nix>;
let
libStr = import <nixpkgs/lib/strings.nix>;
libAttr = import <nixpkgs/lib/attrsets.nix>;
flipMapAttrs = flip libAttr.mapAttrs;
in
rec {
/* Generate a line of key k and value v, separated by
* character sep. If sep appears in k, it is escaped.
* Helper for synaxes with different separators.
*
* mkKeyValueDefault ":" "f:oo" "bar"
* > "f\:oo:bar"
*/
mkKeyValueDefault = sep: k: v:
"${libStr.escape [sep] k}${sep}${toString v}";
/* Generate a key-value-style config file from an attrset.
*
* mkKeyValue is the same as in toINI.
*/
toKeyValue = {
mkKeyValue ? mkKeyValueDefault "="
}: attrs:
let mkLine = k: v: mkKeyValue k v + "\n";
in libStr.concatStrings (libAttr.mapAttrsToList mkLine attrs);
/* Generate an INI-style config file from an
* attrset of sections to an attrset of key-value pairs.
*
* generators.toINI {} {
* foo = { hi = "${pkgs.hello}"; ciao = "bar"; };
* baz = { "also, integers" = 42; };
* }
*
*> [baz]
*> also, integers=42
*>
*> [foo]
*> ciao=bar
*> hi=/nix/store/y93qql1p5ggfnaqjjqhxcw0vqw95rlz0-hello-2.10
*
* The mk* configuration attributes can generically change
* the way sections and key-value strings are generated.
*
* For more examples see the test cases in ./tests.nix.
*/
toINI = {
# apply transformations (e.g. escapes) to section names
mkSectionName ? (name: libStr.escape [ "[" "]" ] name),
# format a setting line from key and value
mkKeyValue ? mkKeyValueDefault "="
}: attrsOfAttrs:
let
# map function to string for each key val
mapAttrsToStringsSep = sep: mapFn: attrs:
libStr.concatStringsSep sep
(libAttr.mapAttrsToList mapFn attrs);
mkSection = sectName: sectValues: ''
[${mkSectionName sectName}]
'' + toKeyValue { inherit mkKeyValue; } sectValues;
in
# map input to ini sections
mapAttrsToStringsSep "\n" mkSection attrsOfAttrs;
/* Generates JSON from an arbitrary (non-function) value.
* For more information see the documentation of the builtin.
*/
toJSON = {}: builtins.toJSON;
/* YAML has been a strict superset of JSON since 1.2, so we
* use toJSON. Before it only had a few differences referring
* to implicit typing rules, so it should work with older
* parsers as well.
*/
toYAML = {}@args: toJSON args;
}

View file

@ -8,7 +8,7 @@ let
cfg2 = config.gtk.gtk2; cfg2 = config.gtk.gtk2;
cfg3 = config.gtk.gtk3; cfg3 = config.gtk.gtk3;
toGtk3Ini = (import ../lib/generators.nix).toINI { toGtk3Ini = generators.toINI {
mkKeyValue = key: value: mkKeyValue = key: value:
let let
value' = value' =

View file

@ -6,8 +6,6 @@ let
cfg = config.programs.git; cfg = config.programs.git;
toINI = (import ../lib/generators.nix).toINI {};
signModule = types.submodule { signModule = types.submodule {
options = { options = {
key = mkOption { key = mkOption {
@ -93,7 +91,8 @@ in
{ {
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];
home.file.".gitconfig".text = toINI ini + "\n" + cfg.extraConfig; home.file.".gitconfig".text =
generators.toINI {} ini + "\n" + cfg.extraConfig;
} }
); );
} }

View file

@ -90,7 +90,7 @@ let
} }
); );
toINI = (import ../lib/generators.nix).toINI { mkKeyValue = mkIniKeyValue; }; toDconfIni = generators.toINI { mkKeyValue = mkIniKeyValue; };
mkIniKeyValue = key: value: mkIniKeyValue = key: value:
let let
@ -181,14 +181,15 @@ in
# The dconf service needs to be installed and prepared. # The dconf service needs to be installed and prepared.
home.activation.gnomeTerminal = dagEntryAfter ["installPackages"] ( home.activation.gnomeTerminal = dagEntryAfter ["installPackages"] (
let let
sf = pkgs.writeText "gnome-terminal.ini" (toINI (buildIniSet cfg)); iniText = toDconfIni (buildIniSet cfg);
iniFile = pkgs.writeText "gnome-terminal.ini" iniText;
dconfPath = "/org/gnome/terminal/legacy/"; dconfPath = "/org/gnome/terminal/legacy/";
in in
'' ''
if [[ -v DRY_RUN ]]; then if [[ -v DRY_RUN ]]; then
echo ${pkgs.gnome3.dconf}/bin/dconf load ${dconfPath} "<" ${sf} echo ${pkgs.gnome3.dconf}/bin/dconf load ${dconfPath} "<" ${iniFile}
else else
${pkgs.gnome3.dconf}/bin/dconf load ${dconfPath} < ${sf} ${pkgs.gnome3.dconf}/bin/dconf load ${dconfPath} < ${iniFile}
fi fi
'' ''
); );

View file

@ -12,7 +12,7 @@ let
|| cfg.targets != {} || cfg.targets != {}
|| cfg.timers != {}; || cfg.timers != {};
toSystemdIni = (import lib/generators.nix).toINI { toSystemdIni = generators.toINI {
mkKeyValue = key: value: mkKeyValue = key: value:
let let
value' = value' =