From a965b097b1e0c3bcf22f39413afd1ec6cc1f5335 Mon Sep 17 00:00:00 2001 From: Robert Helgesson Date: Fri, 13 Aug 2021 01:50:09 +0200 Subject: [PATCH] lib.gvariant: fix rendering of empty non-string arrays Before, empty arrays would always be rendered as an empty string array. --- modules/lib/gvariant.nix | 2 ++ modules/lib/types.nix | 12 +++++++++--- tests/lib/types/gvariant-merge.nix | 11 +++++++---- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/modules/lib/gvariant.nix b/modules/lib/gvariant.nix index 0704635a..67e41a19 100644 --- a/modules/lib/gvariant.nix +++ b/modules/lib/gvariant.nix @@ -71,6 +71,8 @@ in rec { inherit type typeOf; + isGVariant = v: v._type or "" == "gvariant"; + isArray = hasPrefix "a"; isMaybe = hasPrefix "m"; isTuple = hasPrefix "("; diff --git a/modules/lib/types.nix b/modules/lib/types.nix index a7d1dd21..4be95a48 100644 --- a/modules/lib/types.nix +++ b/modules/lib/types.nix @@ -70,7 +70,11 @@ in rec { check = v: gvar.mkValue v != null; merge = loc: defs: let - vdefs = map (d: d // { value = gvar.mkValue d.value; }) defs; + vdefs = map (d: + d // { + value = + if gvar.isGVariant d.value then d.value else gvar.mkValue d.value; + }) defs; vals = map (d: d.value) vdefs; defTypes = map (x: x.type) vals; sameOrNull = x: y: if x == y then y else null; @@ -82,8 +86,10 @@ in rec { + " mismatched GVariant types given in" + " ${showFiles (getFiles defs)}.") else if gvar.isArray sharedDefType && allChecked then - (types.listOf gvariant).merge loc - (map (d: d // { value = d.value.value; }) vdefs) + gvar.mkValue ((types.listOf gvariant).merge loc + (map (d: d // { value = d.value.value; }) vdefs)) // { + type = sharedDefType; + } else if gvar.isTuple sharedDefType && allChecked then mergeOneOption loc defs else if gvar.isMaybe sharedDefType && allChecked then diff --git a/tests/lib/types/gvariant-merge.nix b/tests/lib/types/gvariant-merge.nix index faa9b1e3..d2cdb535 100644 --- a/tests/lib/types/gvariant-merge.nix +++ b/tests/lib/types/gvariant-merge.nix @@ -33,8 +33,10 @@ in { { uint64 = mkUint64 42; } { uint64 = mkUint64 42; } - { list = [ "one" ]; } - { list = mkArray type.string [ "two" ]; } + { array1 = [ "one" ]; } + { array1 = mkArray type.string [ "two" ]; } + { array2 = mkArray type.uint32 [ 1 ]; } + { array2 = mkArray type.uint32 [ 2 ]; } { emptyArray1 = [ ]; } { emptyArray2 = mkEmptyArray type.uint32; } @@ -63,15 +65,16 @@ in { home-files/result.txt \ ${ pkgs.writeText "expected.txt" '' + array1 = @as ['one','two'] + array2 = @au [1,2] bool = true emptyArray1 = @as [] - emptyArray2 = @as [] + emptyArray2 = @au [] escapedString = '\'\\\n' float = 3.140000 int = -42 int16 = @n -42 int64 = @x -42 - list = @as ['one','two'] maybe1 = @ms nothing maybe2 = just @u 4 string = 'foo'