mirror of
https://github.com/nix-community/nixvim.git
synced 2025-06-21 00:25:42 +02:00
lib/to-lua: fix removing empties nested in lists
- Add options for removing empty/null list entries (default false) - Fix recursion into attrs that are themselves list entries Fixes #1804
This commit is contained in:
parent
87f50db84d
commit
9b25eaaa6f
2 changed files with 125 additions and 11 deletions
|
@ -84,9 +84,21 @@ rec {
|
|||
*/
|
||||
removeEmptyAttrValues ? true,
|
||||
|
||||
/**
|
||||
If this option is true, lists like [ { } [ ] "" ]
|
||||
will render as { "" }
|
||||
*/
|
||||
removeEmptyListEntries ? false,
|
||||
|
||||
/**
|
||||
If this option is true, lists like [ null "" ]
|
||||
will render as { "" }
|
||||
*/
|
||||
removeNullListEntries ? false,
|
||||
|
||||
/**
|
||||
If this option is true, attrsets like { a.__empty = null; }
|
||||
will render as { ["a"] = { } }, ignoring removeEmptyAttrValues and removeNullAttrValues.
|
||||
will render as { ["a"] = { } }, ignoring other filters such as removeEmptyAttrValues.
|
||||
*/
|
||||
allowExplicitEmpty ? true,
|
||||
|
||||
|
@ -111,7 +123,12 @@ rec {
|
|||
}:
|
||||
let
|
||||
# If any of these are options are set, we need to preprocess the value
|
||||
needsPreprocessing = removeNullAttrValues || removeEmptyAttrValues || allowExplicitEmpty;
|
||||
needsPreprocessing =
|
||||
allowExplicitEmpty
|
||||
|| removeEmptyAttrValues
|
||||
|| removeNullAttrValues
|
||||
|| removeEmptyListEntries
|
||||
|| removeNullListEntries;
|
||||
|
||||
# Slight optimization: only preprocess if we actually need to
|
||||
preprocessValue = value: if needsPreprocessing then removeEmptiesRecursive value else value;
|
||||
|
@ -125,23 +142,30 @@ rec {
|
|||
else if allowRawValues && value ? __raw then
|
||||
value
|
||||
else if isList value then
|
||||
map removeEmptiesRecursive value
|
||||
let
|
||||
needsFiltering = removeNullListEntries || removeEmptyListEntries;
|
||||
fn =
|
||||
v: (removeNullListEntries -> (v != null)) && (removeEmptyListEntries -> (v != [ ] && v != { }));
|
||||
v' = map removeEmptiesRecursive value;
|
||||
in
|
||||
if needsFiltering then filter fn v' else v'
|
||||
else if isAttrs value then
|
||||
concatMapAttrs (
|
||||
n: v:
|
||||
let
|
||||
v' = removeEmptiesRecursive v;
|
||||
in
|
||||
if removeNullAttrValues && v == null then
|
||||
{ }
|
||||
else if removeEmptyAttrValues && (v == [ ] || v == { }) then
|
||||
{ }
|
||||
else if allowExplicitEmpty && v ? __empty then
|
||||
{ ${n} = { }; }
|
||||
else if isAttrs v then
|
||||
let
|
||||
v' = removeEmptiesRecursive v;
|
||||
in
|
||||
if v' == { } then { } else { ${n} = v'; }
|
||||
# Optimisation: check if v is empty before evaluating v'
|
||||
else if removeEmptyAttrValues && (v == [ ] || v == { }) then
|
||||
{ }
|
||||
else if removeEmptyAttrValues && (v' == [ ] || v' == { }) then
|
||||
{ }
|
||||
else
|
||||
{ ${n} = v; }
|
||||
{ ${n} = v'; }
|
||||
) value
|
||||
else
|
||||
value;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue