lib/utils: add nestedLiteral and nestedLiteralLua

`nestedLiteral` converts a `literalExpression` into a `toPretty` style
pretty-printer.

`nestedLiteralLua` composes `nestedLiteral` and `literalLua` together.
This commit is contained in:
Matt Sturgeon 2024-11-15 13:45:46 +00:00
parent eb76e62a9b
commit da6e3499d4
No known key found for this signature in database
GPG key ID: 4F91844CED1A8299
3 changed files with 88 additions and 0 deletions

View file

@ -97,6 +97,8 @@ lib.fix (
mkIfNonNull'
mkRaw
mkRawKey
nestedLiteral
nestedLiteralLua
override
overrideDerivation
toRawKeys

View file

@ -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}

View file

@ -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"