tools/diff-processor/diff/sets.go (65 lines of code) (raw):
package diff
import (
"sort"
"strings"
)
// Return the union of two maps, overwriting any shared keys with the second map's values
func union[K comparable, V any](map1, map2 map[K]V) map[K]V {
if len(map1) == 0 {
return map2
}
if len(map2) == 0 {
return map1
}
merged := make(map[K]V, len(map1)+len(map2))
for k, v := range map1 {
merged[k] = v
}
for k, v := range map2 {
merged[k] = v
}
return merged
}
func sliceToSetRemoveZeroPadding(slice []string) map[string]struct{} {
set := make(map[string]struct{})
for _, item := range slice {
set[removeZeroPadding(item)] = struct{}{}
}
return set
}
// field1.0.field2 -> field1.field2
func removeZeroPadding(zeroPadded string) string {
var trimmed string
for _, part := range strings.Split(zeroPadded, ".") {
if part != "0" {
trimmed += part + "."
}
}
if trimmed == "" {
return ""
}
return trimmed[:len(trimmed)-1]
}
func setToSortedSlice(set map[string]struct{}) []string {
slice := make([]string, 0, len(set))
for item := range set {
slice = append(slice, item)
}
sort.Strings(slice)
return slice
}
func (fs FieldSet) IsSubsetOf(other FieldSet) bool {
for field := range fs {
if _, ok := other[field]; !ok {
return false
}
}
return true
}
func (fs FieldSet) Difference(subset FieldSet) map[string]struct{} {
diff := make(map[string]struct{})
for k := range fs {
if _, ok := subset[k]; !ok {
diff[k] = struct{}{}
}
}
return diff
}