cosmos-sdk/tools/confix/match.go
mergify[bot] 2ee5230b2c
feat(confix): add migration to v2 (backport #21052) (#21103)
Co-authored-by: Akhil Kumar P <36399231+akhilkumarpilli@users.noreply.github.com>
Co-authored-by: akhilkumarpilli <akhilkumar7947@gmail.com>
2024-07-30 10:33:06 +02:00

64 lines
1.4 KiB
Go

package confix
import (
"sort"
"github.com/creachadair/tomledit"
"github.com/creachadair/tomledit/transform"
)
// MatchKeys diffs the keyspaces of the TOML documents in files lhs and rhs.
// Comments, order, and values are ignored for comparison purposes.
// It will return in the format of map[oldKey]newKey
func MatchKeys(lhs, rhs *tomledit.Document) map[string]string {
matches := matchDocs(map[string]string{}, allKVs(lhs.Global), allKVs(rhs.Global))
lsec, rsec := lhs.Sections, rhs.Sections
transform.SortSectionsByName(lsec)
transform.SortSectionsByName(rsec)
i, j := 0, 0
for i < len(lsec) && j < len(rsec) {
switch {
case lsec[i].Name.Before(rsec[j].Name):
i++
case rsec[j].Name.Before(lsec[i].Name):
j++
default:
matches = matchDocs(matches, allKVs(lsec[i]), allKVs(rsec[j]))
i++
j++
}
}
return matches
}
// matchDocs get all the keys matching in lhs and rhs.
// value of keys are ignored
func matchDocs(matchesMap map[string]string, lhs, rhs []KV) map[string]string {
sort.Slice(lhs, func(i, j int) bool {
return lhs[i].Key < lhs[j].Key
})
sort.Slice(rhs, func(i, j int) bool {
return rhs[i].Key < rhs[j].Key
})
i, j := 0, 0
for i < len(lhs) && j < len(rhs) {
switch {
case lhs[i].Key < rhs[j].Key:
i++
case lhs[i].Key > rhs[j].Key:
j++
default:
// key exists in both lhs and rhs
matchesMap[lhs[i].Key] = rhs[j].Key
i++
j++
}
}
return matchesMap
}