Co-authored-by: Akhil Kumar P <36399231+akhilkumarpilli@users.noreply.github.com> Co-authored-by: akhilkumarpilli <akhilkumar7947@gmail.com>
64 lines
1.4 KiB
Go
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
|
|
}
|