@@ -133,13 +133,6 @@ func StructToSchema(v any, customize func(map[string]*schema.Schema) map[string]
133133 return scm
134134}
135135
136- // SetSuppressDiff adds diff suppression to a schema. This is necessary for non-computed
137- // fields for which the platform returns a value, but the user has not configured any value.
138- // For example: the REST API returns `{"tags": {}}` for a resource with no tags.
139- func SetSuppressDiff (v * schema.Schema ) {
140- v .DiffSuppressFunc = diffSuppressor (v )
141- }
142-
143136// SetDefault sets the default value for a schema.
144137func SetDefault (v * schema.Schema , value any ) {
145138 v .Default = value
@@ -216,11 +209,11 @@ func handleSensitive(typeField reflect.StructField, schema *schema.Schema) {
216209 }
217210}
218211
219- func handleSuppressDiff (typeField reflect.StructField , v * schema.Schema ) {
212+ func handleSuppressDiff (typeField reflect.StructField , fieldName string , v * schema.Schema ) {
220213 tfTags := strings .Split (typeField .Tag .Get ("tf" ), "," )
221214 for _ , tag := range tfTags {
222215 if tag == "suppress_diff" {
223- v .DiffSuppressFunc = diffSuppressor (v )
216+ v .DiffSuppressFunc = diffSuppressor (fieldName , v )
224217 break
225218 }
226219 }
@@ -244,16 +237,18 @@ func chooseFieldName(typeField reflect.StructField) string {
244237 return getJsonFieldName (typeField )
245238}
246239
247- func diffSuppressor (v * schema.Schema ) func (k , old , new string , d * schema.ResourceData ) bool {
240+ func diffSuppressor (fieldName string , v * schema.Schema ) func (k , old , new string , d * schema.ResourceData ) bool {
248241 zero := fmt .Sprintf ("%v" , v .Type .Zero ())
249242 return func (k , old , new string , d * schema.ResourceData ) bool {
250243 if new == zero && old != zero {
251244 log .Printf ("[DEBUG] Suppressing diff for %v: platform=%#v config=%#v" , k , old , new )
252245 return true
253246 }
254- if strings .HasSuffix (k , ".#" ) && new == "0" && old != "0" {
255- field := strings .TrimSuffix (k , ".#" )
256- log .Printf ("[DEBUG] Suppressing diff for list or set %v: no value configured but platform returned some value (likely {})" , field )
247+ // When suppressing diffs for a list of attributes, SuppressDiffFunc is called for each diff
248+ // recursively. To verify that the list is empty, we need to ensure that the key being diffed
249+ // is exactly the list's attribute itself and not one of its elements.
250+ if strings .HasSuffix (k , fmt .Sprintf ("%s.#" , fieldName )) && new == "0" && old != "0" {
251+ log .Printf ("[DEBUG] Suppressing diff for list or set %v: no value configured but platform returned some value (likely {})" , fieldName )
257252 return true
258253 }
259254 return false
@@ -334,17 +329,17 @@ func typeToSchema(v reflect.Value, aliases map[string]string) map[string]*schema
334329 case reflect .Int , reflect .Int32 , reflect .Int64 :
335330 scm [fieldName ].Type = schema .TypeInt
336331 // diff suppression needs type for zero value
337- handleSuppressDiff (typeField , scm [fieldName ])
332+ handleSuppressDiff (typeField , fieldName , scm [fieldName ])
338333 case reflect .Float64 :
339334 scm [fieldName ].Type = schema .TypeFloat
340335 // diff suppression needs type for zero value
341- handleSuppressDiff (typeField , scm [fieldName ])
336+ handleSuppressDiff (typeField , fieldName , scm [fieldName ])
342337 case reflect .Bool :
343338 scm [fieldName ].Type = schema .TypeBool
344339 case reflect .String :
345340 scm [fieldName ].Type = schema .TypeString
346341 // diff suppression needs type for zero value
347- handleSuppressDiff (typeField , scm [fieldName ])
342+ handleSuppressDiff (typeField , fieldName , scm [fieldName ])
348343 case reflect .Map :
349344 scm [fieldName ].Type = schema .TypeMap
350345 elem := typeField .Type .Elem ()
@@ -363,10 +358,9 @@ func typeToSchema(v reflect.Value, aliases map[string]string) map[string]*schema
363358 sv := reflect .New (elem ).Elem ()
364359 nestedSchema := typeToSchema (sv , unwrappedAliases )
365360 if strings .Contains (tfTag , "suppress_diff" ) {
366- scm [fieldName ].DiffSuppressFunc = diffSuppressor (scm [fieldName ])
367- for _ , v := range nestedSchema {
368- // to those relatively new to GoLang: we must explicitly pass down v by copy
369- v .DiffSuppressFunc = diffSuppressor (v )
361+ scm [fieldName ].DiffSuppressFunc = diffSuppressor (fieldName , scm [fieldName ])
362+ for k , v := range nestedSchema {
363+ v .DiffSuppressFunc = diffSuppressor (k , v )
370364 }
371365 }
372366 scm [fieldName ].Elem = & schema.Resource {
@@ -381,10 +375,9 @@ func typeToSchema(v reflect.Value, aliases map[string]string) map[string]*schema
381375
382376 nestedSchema := typeToSchema (sv , unwrappedAliases )
383377 if strings .Contains (tfTag , "suppress_diff" ) {
384- scm [fieldName ].DiffSuppressFunc = diffSuppressor (scm [fieldName ])
385- for _ , v := range nestedSchema {
386- // to those relatively new to GoLang: we must explicitly pass down v by copy
387- v .DiffSuppressFunc = diffSuppressor (v )
378+ scm [fieldName ].DiffSuppressFunc = diffSuppressor (fieldName , scm [fieldName ])
379+ for k , v := range nestedSchema {
380+ v .DiffSuppressFunc = diffSuppressor (k , v )
388381 }
389382 }
390383 scm [fieldName ].Elem = & schema.Resource {
0 commit comments