mirror of
https://github.com/LukeHagar/libopenapi.git
synced 2025-12-09 20:47:44 +00:00
Fleshing out what-changed functionality.
Starting at the bottom again with low levels and sketching out how to consume it.
This commit is contained in:
89
what-changed/extensions.go
Normal file
89
what-changed/extensions.go
Normal file
@@ -0,0 +1,89 @@
|
||||
// Copyright 2022 Princess B33f Heavy Industries / Dave Shanley
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package what_changed
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/pb33f/libopenapi/datamodel/low"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type ExtensionChanges struct {
|
||||
PropertyChanges
|
||||
}
|
||||
|
||||
func CompareExtensions(l, r map[low.KeyReference[string]]low.ValueReference[any]) *ExtensionChanges {
|
||||
|
||||
// look at the original and then look through the new.
|
||||
seenLeft := make(map[string]*low.ValueReference[any])
|
||||
seenRight := make(map[string]*low.ValueReference[any])
|
||||
for i := range l {
|
||||
h := l[i]
|
||||
seenLeft[strings.ToLower(i.Value)] = &h
|
||||
}
|
||||
for i := range r {
|
||||
h := r[i]
|
||||
seenRight[strings.ToLower(i.Value)] = &h
|
||||
}
|
||||
|
||||
var changes []*Change
|
||||
var changeType int
|
||||
for i := range seenLeft {
|
||||
changeType = 0
|
||||
if seenRight[i] == nil {
|
||||
// deleted
|
||||
changeType = PropertyRemoved
|
||||
ctx := CreateContext(seenLeft[i].ValueNode, nil)
|
||||
changes = append(changes, &Change{
|
||||
Context: ctx,
|
||||
ChangeType: changeType,
|
||||
Property: i,
|
||||
Original: fmt.Sprintf("%v", seenLeft[i].Value),
|
||||
})
|
||||
|
||||
}
|
||||
if seenRight[i] != nil {
|
||||
// potentially modified and or moved
|
||||
ctx := CreateContext(seenLeft[i].ValueNode, seenRight[i].ValueNode)
|
||||
if seenLeft[i].Value != seenRight[i].Value {
|
||||
changeType = Modified
|
||||
}
|
||||
if ctx.HasChanged() {
|
||||
if changeType == Modified {
|
||||
changeType = ModifiedAndMoved
|
||||
} else {
|
||||
changeType = Moved
|
||||
}
|
||||
}
|
||||
if changeType != 0 {
|
||||
changes = append(changes, &Change{
|
||||
Context: ctx,
|
||||
ChangeType: changeType,
|
||||
Property: i,
|
||||
Original: fmt.Sprintf("%v", seenLeft[i].Value),
|
||||
New: fmt.Sprintf("%v", seenRight[i].Value),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
for i := range seenRight {
|
||||
if seenLeft[i] == nil {
|
||||
// added
|
||||
ctx := CreateContext(nil, seenRight[i].ValueNode)
|
||||
changes = append(changes, &Change{
|
||||
Context: ctx,
|
||||
ChangeType: PropertyAdded,
|
||||
Property: i,
|
||||
New: fmt.Sprintf("%v", seenRight[i].Value),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if len(changes) <= 0 {
|
||||
return nil
|
||||
}
|
||||
ex := new(ExtensionChanges)
|
||||
ex.Changes = changes
|
||||
return ex
|
||||
}
|
||||
Reference in New Issue
Block a user