Update message
This commit is contained in:
parent
6de090c540
commit
908c3aeb70
|
@ -188,9 +188,19 @@ func (rp *ResourcePlan) checkGoal(programGoal *resource.Goal) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that the properties meet the constraints set in the plan.
|
// Check that the properties meet the constraints set in the plan.
|
||||||
if _, constrained := programGoal.Properties.ConstrainedTo(rp.Goal.Properties); !constrained {
|
if diff, constrained := programGoal.Properties.ConstrainedTo(rp.Goal.Properties); !constrained {
|
||||||
// TODO(pdg-plan): message!
|
// TODO(pdg-plan): message!
|
||||||
return fmt.Errorf("properties changed")
|
var paths []string
|
||||||
|
for k := range diff.Adds {
|
||||||
|
paths = append(paths, "+"+string(k))
|
||||||
|
}
|
||||||
|
for k := range diff.Deletes {
|
||||||
|
paths = append(paths, "-"+string(k))
|
||||||
|
}
|
||||||
|
for k := range diff.Updates {
|
||||||
|
paths = append(paths, "~"+string(k))
|
||||||
|
}
|
||||||
|
return fmt.Errorf("properties changed: %v", strings.Join(paths, ", "))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that the property dependencies match. Note that because it is legal for a property that is unknown in the
|
// Check that the property dependencies match. Note that because it is legal for a property that is unknown in the
|
||||||
|
|
|
@ -74,6 +74,22 @@ func (diff *ObjectDiff) Keys() []PropertyKey {
|
||||||
return ks
|
return ks
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (diff *ObjectDiff) Paths() []PropertyPath {
|
||||||
|
var paths []PropertyPath
|
||||||
|
for k := range diff.Adds {
|
||||||
|
paths = append(paths, PropertyPath{string(k)})
|
||||||
|
}
|
||||||
|
for k := range diff.Adds {
|
||||||
|
paths = append(paths, PropertyPath{string(k)})
|
||||||
|
}
|
||||||
|
for k, d := range diff.Updates {
|
||||||
|
for _, child := range d.Paths() {
|
||||||
|
paths = append(paths, append(PropertyPath{string(k)}, child...))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return paths
|
||||||
|
}
|
||||||
|
|
||||||
// ValueDiff holds the results of diffing two property values.
|
// ValueDiff holds the results of diffing two property values.
|
||||||
type ValueDiff struct {
|
type ValueDiff struct {
|
||||||
Old PropertyValue // the old value.
|
Old PropertyValue // the old value.
|
||||||
|
@ -82,6 +98,17 @@ type ValueDiff struct {
|
||||||
Object *ObjectDiff // the object's detailed diffs (only for objects).
|
Object *ObjectDiff // the object's detailed diffs (only for objects).
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (diff ValueDiff) Paths() []PropertyPath {
|
||||||
|
switch {
|
||||||
|
case diff.Array != nil:
|
||||||
|
return diff.Array.Paths()
|
||||||
|
case diff.Object != nil:
|
||||||
|
return diff.Object.Paths()
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ArrayDiff holds the results of diffing two arrays of property values.
|
// ArrayDiff holds the results of diffing two arrays of property values.
|
||||||
type ArrayDiff struct {
|
type ArrayDiff struct {
|
||||||
Adds map[int]PropertyValue // elements added in the new.
|
Adds map[int]PropertyValue // elements added in the new.
|
||||||
|
@ -90,6 +117,22 @@ type ArrayDiff struct {
|
||||||
Updates map[int]ValueDiff // elements that have changed in the new.
|
Updates map[int]ValueDiff // elements that have changed in the new.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (diff *ArrayDiff) Paths() []PropertyPath {
|
||||||
|
var paths []PropertyPath
|
||||||
|
for k := range diff.Adds {
|
||||||
|
paths = append(paths, PropertyPath{k})
|
||||||
|
}
|
||||||
|
for k := range diff.Adds {
|
||||||
|
paths = append(paths, PropertyPath{k})
|
||||||
|
}
|
||||||
|
for k, d := range diff.Updates {
|
||||||
|
for _, child := range d.Paths() {
|
||||||
|
paths = append(paths, append(PropertyPath{k}, child...))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return paths
|
||||||
|
}
|
||||||
|
|
||||||
// Len computes the length of this array, taking into account adds, deletes, sames, and updates.
|
// Len computes the length of this array, taking into account adds, deletes, sames, and updates.
|
||||||
func (diff *ArrayDiff) Len() int {
|
func (diff *ArrayDiff) Len() int {
|
||||||
len := 0
|
len := 0
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package resource
|
package resource
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -291,3 +293,35 @@ func (p PropertyPath) Contains(other PropertyPath) bool {
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func requiresQuote(c rune) bool {
|
||||||
|
return !(c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' || c >= '0' && c <= '9' || c == '_')
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p PropertyPath) String() string {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
for _, k := range p {
|
||||||
|
switch k := k.(type) {
|
||||||
|
case string:
|
||||||
|
var keyBuf bytes.Buffer
|
||||||
|
quoted := false
|
||||||
|
for _, c := range k {
|
||||||
|
if requiresQuote(c) {
|
||||||
|
quoted = true
|
||||||
|
if c == '"' {
|
||||||
|
keyBuf.WriteByte('\\')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
keyBuf.WriteRune(c)
|
||||||
|
}
|
||||||
|
if !quoted {
|
||||||
|
fmt.Fprintf(&buf, ".%s", keyBuf.String())
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(&buf, `["%s"]`, keyBuf.String())
|
||||||
|
}
|
||||||
|
case int:
|
||||||
|
fmt.Fprintf(&buf, "[%d]", k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buf.String()
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue