From 7c8bf29df35748c662aacef85a49bc4a1dc4c327 Mon Sep 17 00:00:00 2001 From: Josh Robson Chase Date: Mon, 15 Apr 2024 07:55:03 -0400 Subject: [PATCH] generators.toKDL: support repeated nodes, break JiK compat Replaces the list attr -> KDL conversion logic with a more flexible approach, allowing for multiple nodes with the same name in a scope. This unfortunately also breaks the existing JSON-in-KDL semantics in favor of ergonomics. As far as I can tell though, zellij is the only program using it, and it doesn't accept JiK anyway. For example, the following KDL was previously impossible to generate, since nix attrs were mapped 1:1 to KDL nodes: ``` resize { bind "k" "Up" { Resize "Increase Up"; } bind "j" "Down" { Resize "Increase Down"; } } ``` Now, this can be achieved with the nix expression: ``` resize.bind = [ { _args = ["k" "Up"]; Resize = "Increase Up"; } { _args = ["j" "Down"]; Resize = "Increase Down"; } ]; ``` which would previously have generated the not-very-useful: ``` resize { bind { - "k" "Up" { Resize "Increase Up"; } - "j" "Down" { Resize "Increase Down"; } } } ``` which, in turn, can now be generated via: ``` resize.bind."-" = [ { _args = ["k" "Up"]; Resize = "Increase Up"; } { _args = ["j" "Down"]; Resize = "Increase Down"; } ]; ``` --- modules/lib/generators.nix | 6 ++---- tests/lib/generators/tokdl-result.txt | 14 +++++--------- tests/lib/generators/tokdl.nix | 6 +++--- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/modules/lib/generators.nix b/modules/lib/generators.nix index 9cb0e1cf9..eb5560975 100644 --- a/modules/lib/generators.nix +++ b/modules/lib/generators.nix @@ -68,10 +68,8 @@ in "${name} ${concatStringsSep " " flatElements}"; # String -> ListOf Anything -> String - convertListOfNonFlatAttrsToKDL = name: list: '' - ${name} { - ${indentStrings (map (x: convertAttributeToKDL "-" x) list)} - }''; + convertListOfNonFlatAttrsToKDL = name: list: + "${concatStringsSep "\n" (map (x: convertAttributeToKDL name x) list)}"; # String -> ListOf Anything -> String convertListToKDL = name: list: diff --git a/tests/lib/generators/tokdl-result.txt b/tests/lib/generators/tokdl-result.txt index 6ad2af368..a314bddd7 100644 --- a/tests/lib/generators/tokdl-result.txt +++ b/tests/lib/generators/tokdl-result.txt @@ -27,15 +27,11 @@ listInAttrsInList { } } list2 { - - { - a 8 - } + a 8 } } -nested { - - 1 2 - - true false - - - - null -} +repeated 1 2 +repeated true false +repeated +repeated null unsafeString " \" \n " diff --git a/tests/lib/generators/tokdl.nix b/tests/lib/generators/tokdl.nix index 6e4a4047b..364a96c3b 100644 --- a/tests/lib/generators/tokdl.nix +++ b/tests/lib/generators/tokdl.nix @@ -20,7 +20,7 @@ '' null ]; - nested = [ [ 1 2 ] [ true false ] [ ] [ null ] ]; + repeated = [ [ 1 2 ] [ true false ] [ ] [ null ] ]; extraAttrs = { _args = [ 2 true ]; _props = { @@ -33,12 +33,12 @@ }; }; listInAttrsInList = { - list1 = [ + list1."-" = [ { a = 1; } { b = true; } { c = null; - d = [{ e = "asdfadfasdfasdf"; }]; + d."-" = [{ e = "asdfadfasdfasdf"; }]; } ]; list2 = [{ a = 8; }];