aboutsummaryrefslogtreecommitdiff
path: root/modules/lib
diff options
context:
space:
mode:
authorRobert Helgesson <robert@rycee.net>2017-01-07 19:16:26 +0100
committerRobert Helgesson <robert@rycee.net>2017-01-14 13:15:24 +0100
commitd7d02c3ce8f723b3cff03ea7502011883eef8fde (patch)
treef48d291967d59a91dd6590941745fb876c3a29bf /modules/lib
parente4c63eb66aaa10e447f010b3d0f28e3a278ad30d (diff)
Initial import
Diffstat (limited to 'modules/lib')
-rw-r--r--modules/lib/generators.nix93
1 files changed, 93 insertions, 0 deletions
diff --git a/modules/lib/generators.nix b/modules/lib/generators.nix
new file mode 100644
index 00000000000..4190703e236
--- /dev/null
+++ b/modules/lib/generators.nix
@@ -0,0 +1,93 @@
+/* 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;
+}