aboutsummaryrefslogtreecommitdiff
path: root/lib/generators.nix
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2016-11-06 01:51:13 +0100
committerProfpatsch <mail@profpatsch.de>2016-11-17 19:46:41 +0100
commit61311665cb0f11c4688fc0013d732d85bbd66fca (patch)
tree3f742a70994fc274dc498d0c28b465d62805a8bb /lib/generators.nix
parentba73dbbda61b14ec8e2ca0ab526d3b35ba1db74c (diff)
lib: add ini configuration generator
Many configurations are INI-style files. Attribute sets can be mapped rather painlessly to the INI format. This adds a function toINI inside a new generators library section. Also, unit tests for the default values are provided.
Diffstat (limited to 'lib/generators.nix')
-rw-r--r--lib/generators.nix53
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/generators.nix b/lib/generators.nix
new file mode 100644
index 00000000000..90dd3371454
--- /dev/null
+++ b/lib/generators.nix
@@ -0,0 +1,53 @@
+/* Functions that generate widespread config file
+ * formats from nix data structures.
+ * Tests can be found in ./tests.nix
+ */
+with import ./trivial.nix;
+let
+ libStr = import ./strings.nix;
+ libAttr = import ./attrsets.nix;
+
+ flipMapAttrs = flip libAttr.mapAttrs;
+in
+
+{
+
+ /* Generates 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 ? (k: v: "${libStr.escape ["="] k}=${toString v}")
+ }: attrsOfAttrs:
+ let
+ # map function to string for each key val
+ mapAttrsToStringsSep = sep: mapFn: attrs:
+ libStr.concatStringsSep sep
+ (libAttr.mapAttrsToList mapFn attrs);
+ mkLine = k: v: mkKeyValue k v + "\n";
+ mkSection = sectName: sectValues: ''
+ [${mkSectionName sectName}]
+ '' + libStr.concatStrings (libAttr.mapAttrsToList mkLine sectValues);
+ in
+ # map input to ini sections
+ mapAttrsToStringsSep "\n" mkSection attrsOfAttrs;
+}