diff --git a/lib/default.nix b/lib/default.nix index 7100f996..3d357d7c 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -97,6 +97,8 @@ lib.fix ( mkIfNonNull' mkRaw mkRawKey + nestedLiteral + nestedLiteralLua override overrideDerivation toRawKeys diff --git a/lib/utils.nix b/lib/utils.nix index 1a88843d..cde5485a 100644 --- a/lib/utils.nix +++ b/lib/utils.nix @@ -155,6 +155,64 @@ rec { in lib.literalExpression exp; + /** + Convert the given string into a `__pretty` printed mkRaw expression. + + For use in nested values that will be printed by `lib.generators.toPretty`, + or `lib.options.renderOptionValue`. + + # Example + + ```nix + nestedLiteralLua "print('hi')" + => nestedLiteral (literalLua "print('hi')") + => { + __pretty = lib.getAttr "text"; + val = literalLua "print('hi')"; + } + ``` + + # Type + ``` + nestedLiteralLua :: String -> AttrSet + ``` + */ + nestedLiteralLua = r: nestedLiteral (literalLua r); + + /** + Convert the given string or literalExpression into a `__pretty` printed expression. + + For use in nested values that will be printed by `lib.generators.toPretty`, + or `lib.options.renderOptionValue`. + + # Examples + + ```nix + nestedLiteral "example" + => { + __pretty = lib.getAttr "text"; + val = literalExpression "example"; + } + ``` + + ```nix + nestedLiteral (literalExpression ''"hello, world"'') + => { + __pretty = lib.getAttr "text"; + val = literalExpression ''"hello, world"''; + } + ``` + + # Type + ``` + nestedLiteral :: (String | literalExpression) -> AttrSet + ``` + */ + nestedLiteral = val: { + __pretty = lib.getAttr "text"; + val = if val._type or null == "literalExpression" then val else lib.literalExpression val; + }; + wrapDo = string: '' do ${string} diff --git a/tests/lib-tests.nix b/tests/lib-tests.nix index fed0ab47..cc08e086 100644 --- a/tests/lib-tests.nix +++ b/tests/lib-tests.nix @@ -331,6 +331,34 @@ let }; }; + # Integration test for nestedLiteral and renderOptionValue + testNestedLiteral_withRenderOptionValue = { + expr = + builtins.mapAttrs + ( + _: v: + (lib.options.renderOptionValue { + literal = helpers.nestedLiteral v; + }).text + ) + { + empty = ""; + sum = "1 + 1"; + print = ''lib.mkRaw "print('hi')"''; + }; + expected = + builtins.mapAttrs + (_: literal: '' + { + literal = ${literal}; + }'') + { + empty = ""; + sum = "1 + 1"; + print = ''lib.mkRaw "print('hi')"''; + }; + }; + testUpperFirstChar = { expr = map helpers.upperFirstChar [ "foo"