| 
									
										
										
										
											2016-11-17 22:29:32 +01:00
										 |  |  | /* Functions that generate widespread file
 | 
					
						
							| 
									
										
										
										
											2016-11-06 01:51:13 +01:00
										 |  |  |  * formats from nix data structures. | 
					
						
							| 
									
										
										
										
											2016-11-17 22:29:32 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * They all follow a similar interface: | 
					
						
							|  |  |  |  * generator { config-attrs } data | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2016-11-06 01:51:13 +01:00
										 |  |  |  * Tests can be found in ./tests.nix | 
					
						
							| 
									
										
										
										
											2016-11-17 22:29:32 +01:00
										 |  |  |  * Documentation in the manual, #sec-generators | 
					
						
							| 
									
										
										
										
											2016-11-06 01:51:13 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | with import ./trivial.nix; | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  |   libStr = import ./strings.nix; | 
					
						
							|  |  |  |   libAttr = import ./attrsets.nix; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   flipMapAttrs = flip libAttr.mapAttrs; | 
					
						
							|  |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-06 14:14:24 +01:00
										 |  |  | rec { | 
					
						
							| 
									
										
										
										
											2016-11-06 01:51:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-04 22:11:24 +01:00
										 |  |  |   /* 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. | 
					
						
							|  |  |  |    * | 
					
						
							| 
									
										
										
										
											2016-12-06 23:19:34 +01:00
										 |  |  |    * mkKeyValueDefault ":" "f:oo" "bar" | 
					
						
							| 
									
										
										
										
											2016-12-04 22:11:24 +01:00
										 |  |  |    * > "f\:oo:bar" | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2016-12-06 23:19:34 +01:00
										 |  |  |   mkKeyValueDefault = sep: k: v: | 
					
						
							| 
									
										
										
										
											2016-12-04 22:11:24 +01:00
										 |  |  |     "${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 = { | 
					
						
							| 
									
										
										
										
											2016-12-06 23:19:34 +01:00
										 |  |  |     mkKeyValue ? mkKeyValueDefault "=" | 
					
						
							| 
									
										
										
										
											2016-12-04 22:11:24 +01:00
										 |  |  |   }: attrs: | 
					
						
							|  |  |  |     let mkLine = k: v: mkKeyValue k v + "\n"; | 
					
						
							|  |  |  |     in libStr.concatStrings (libAttr.mapAttrsToList mkLine attrs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Generate an INI-style config file from an
 | 
					
						
							| 
									
										
										
										
											2016-11-06 01:51:13 +01:00
										 |  |  |    * 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 | 
					
						
							| 
									
										
										
										
											2016-12-06 23:19:34 +01:00
										 |  |  |     mkKeyValue    ? mkKeyValueDefault "=" | 
					
						
							| 
									
										
										
										
											2016-11-06 01:51:13 +01:00
										 |  |  |   }: 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}] | 
					
						
							| 
									
										
										
										
											2016-12-04 22:11:24 +01:00
										 |  |  |         '' + toKeyValue { inherit mkKeyValue; } sectValues;
 | 
					
						
							| 
									
										
										
										
											2016-11-06 01:51:13 +01:00
										 |  |  |     in | 
					
						
							|  |  |  |       # map input to ini sections | 
					
						
							|  |  |  |       mapAttrsToStringsSep "\n" mkSection attrsOfAttrs; | 
					
						
							| 
									
										
										
										
											2016-11-06 14:14:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* 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; | 
					
						
							| 
									
										
										
										
											2016-11-06 01:51:13 +01:00
										 |  |  | } |