@@ -39,32 +39,50 @@ func TransformErr(
39
39
}, value )
40
40
}
41
41
42
+ // isNilArray returns true if a property value is not nil but its underlying array is nil.
43
+ // See https://dave.cheney.net/2017/08/09/typed-nils-in-go-2 for more details.
44
+ func isNilArray (value resource.PropertyValue ) bool {
45
+ return value .IsArray () && ! value .IsNull () && value .ArrayValue () == nil
46
+ }
47
+
48
+ // isNilObject returns true if a property value is not nil but its underlying object is nil.
49
+ // See https://dave.cheney.net/2017/08/09/typed-nils-in-go-2 for more details.
50
+ func isNilObject (value resource.PropertyValue ) bool {
51
+ return value .IsObject () && ! value .IsNull () && value .ObjectValue () == nil
52
+ }
53
+
42
54
func TransformPropertyValue (
43
55
path resource.PropertyPath ,
44
56
transformer func (resource.PropertyPath , resource.PropertyValue ) (resource.PropertyValue , error ),
45
57
value resource.PropertyValue ,
46
58
) (resource.PropertyValue , error ) {
47
59
switch {
48
60
case value .IsArray ():
49
- tvs := []resource.PropertyValue {}
50
- for i , v := range value .ArrayValue () {
51
- tv , err := TransformPropertyValue (extendPath (path , i ), transformer , v )
52
- if err != nil {
53
- return resource .NewNullProperty (), err
61
+ // preserve nil arrays
62
+ if ! isNilArray (value ) {
63
+ tvs := []resource.PropertyValue {}
64
+ for i , v := range value .ArrayValue () {
65
+ tv , err := TransformPropertyValue (extendPath (path , i ), transformer , v )
66
+ if err != nil {
67
+ return resource .NewNullProperty (), err
68
+ }
69
+ tvs = append (tvs , tv )
54
70
}
55
- tvs = append (tvs , tv )
71
+ value = resource . NewArrayProperty (tvs )
56
72
}
57
- value = resource .NewArrayProperty (tvs )
58
73
case value .IsObject ():
59
- pm := make (resource.PropertyMap )
60
- for k , v := range value .ObjectValue () {
61
- tv , err := TransformPropertyValue (extendPath (path , string (k )), transformer , v )
62
- if err != nil {
63
- return resource .NewNullProperty (), err
74
+ // preserve nil objects
75
+ if ! isNilObject (value ) {
76
+ pm := make (resource.PropertyMap )
77
+ for k , v := range value .ObjectValue () {
78
+ tv , err := TransformPropertyValue (extendPath (path , string (k )), transformer , v )
79
+ if err != nil {
80
+ return resource .NewNullProperty (), err
81
+ }
82
+ pm [k ] = tv
64
83
}
65
- pm [ k ] = tv
84
+ value = resource . NewObjectProperty ( pm )
66
85
}
67
- value = resource .NewObjectProperty (pm )
68
86
case value .IsOutput ():
69
87
o := value .OutputValue ()
70
88
te , err := TransformPropertyValue (path , transformer , o .Element )
0 commit comments