func AddingExactlyOneOfMessages()

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
}