summary refs log tree commit diff
path: root/lib/generators.nix
diff options
context:
space:
mode:
authorSilvan Mosberger <contact@infinisil.com>2020-09-17 17:58:04 +0200
committerSilvan Mosberger <contact@infinisil.com>2020-09-17 18:20:31 +0200
commit073e9b2aed0f855ce26bd3a26dab044c0c17c817 (patch)
tree6b0f3bae170b862c336d7820f4b3b2e38ca5f235 /lib/generators.nix
parent47f2eb89c16a74881c6e1a3b18290bf3d0f94a60 (diff)
downloadnixpkgs-073e9b2aed0f855ce26bd3a26dab044c0c17c817.tar
nixpkgs-073e9b2aed0f855ce26bd3a26dab044c0c17c817.tar.gz
nixpkgs-073e9b2aed0f855ce26bd3a26dab044c0c17c817.tar.bz2
nixpkgs-073e9b2aed0f855ce26bd3a26dab044c0c17c817.tar.lz
nixpkgs-073e9b2aed0f855ce26bd3a26dab044c0c17c817.tar.xz
nixpkgs-073e9b2aed0f855ce26bd3a26dab044c0c17c817.tar.zst
nixpkgs-073e9b2aed0f855ce26bd3a26dab044c0c17c817.zip
lib/generators.toPretty: Improved string printing, handling newlines
Diffstat (limited to 'lib/generators.nix')
-rw-r--r--lib/generators.nix14
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/generators.nix b/lib/generators.nix
index 23a74c757f8..81bedd13d80 100644
--- a/lib/generators.nix
+++ b/lib/generators.nix
@@ -213,7 +213,19 @@ rec {
             outroSpace = if multiline then "\n${indent}" else " ";
     in if   isInt      v then toString v
     else if isFloat    v then "~${toString v}"
-    else if isString   v then ''"${libStr.escape [''"''] v}"''
+    else if isString   v then
+      let
+        # Separate a string into its lines
+        newlineSplits = filter (v: ! isList v) (builtins.split "\n" v);
+        # For a '' string terminated by a \n, which happens when the closing '' is on a new line
+        multilineResult = "''" + introSpace + concatStringsSep introSpace (lib.init newlineSplits) + outroSpace + "''";
+        # For a '' string not terminated by a \n, which happens when the closing '' is not on a new line
+        multilineResult' = "''" + introSpace + concatStringsSep introSpace newlineSplits + "''";
+        # For single lines, replace all newlines with their escaped representation
+        singlelineResult = "\"" + libStr.escape [ "\"" ] (concatStringsSep "\\n" newlineSplits) + "\"";
+      in if multiline && length newlineSplits > 1 then
+        if lib.last newlineSplits == "" then multilineResult else multilineResult'
+      else singlelineResult
     else if true  ==   v then "true"
     else if false ==   v then "false"
     else if null  ==   v then "null"