diff options
author | Robert Helgesson <robert@rycee.net> | 2017-01-07 19:16:26 +0100 |
---|---|---|
committer | Robert Helgesson <robert@rycee.net> | 2017-01-14 13:15:24 +0100 |
commit | d7d02c3ce8f723b3cff03ea7502011883eef8fde (patch) | |
tree | f48d291967d59a91dd6590941745fb876c3a29bf /modules/lib | |
parent | e4c63eb66aaa10e447f010b3d0f28e3a278ad30d (diff) |
Initial import
Diffstat (limited to 'modules/lib')
-rw-r--r-- | modules/lib/generators.nix | 93 |
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; +} |