in tools/diff-processor/breaking_changes/resource_diff.go [45:80]
func AddingExactlyOneOfMessages(resource string, resourceDiff diff.ResourceDiff) []string {
var messages []string
newFieldSets := make(map[string]diff.FieldSet) // Set of field sets in new and not in old.
oldFieldSets := make(map[string]diff.FieldSet) // Set of field sets in old and not in new.
for key, fieldSet := range resourceDiff.FieldSets.New.ExactlyOneOf {
if _, ok := resourceDiff.FieldSets.Old.ExactlyOneOf[key]; !ok {
newFieldSets[key] = fieldSet
}
}
for key, fieldSet := range resourceDiff.FieldSets.Old.ExactlyOneOf {
if _, ok := resourceDiff.FieldSets.New.ExactlyOneOf[key]; !ok {
oldFieldSets[key] = fieldSet
}
}
// Find old field sets which are subsets of new field sets.
for _, newFieldSet := range newFieldSets {
var addedFields diff.FieldSet
found := false
for _, oldFieldSet := range oldFieldSets {
if oldFieldSet.IsSubsetOf(newFieldSet) {
addedFields = newFieldSet.Difference(oldFieldSet)
found = true
break
}
}
if !found {
addedFields = newFieldSet
}
for field := range addedFields {
if fieldDiff, ok := resourceDiff.Fields[field]; ok && fieldDiff.Old != nil && !fieldDiff.Old.Required {
messages = append(messages, fmt.Sprintf("Field `%s` within resource `%s` was added to exactly one of", field, resource))
}
}
}
return messages
}