...
1
13
14 package fieldpath
15
16 import (
17 "fmt"
18 "strings"
19 )
20
21
22 type APIVersion string
23
24 type VersionedSet interface {
25 Set() *Set
26 APIVersion() APIVersion
27 Applied() bool
28 }
29
30
31 type versionedSet struct {
32 set *Set
33 apiVersion APIVersion
34 applied bool
35 }
36
37 func NewVersionedSet(set *Set, apiVersion APIVersion, applied bool) VersionedSet {
38 return versionedSet{
39 set: set,
40 apiVersion: apiVersion,
41 applied: applied,
42 }
43 }
44
45 func (v versionedSet) Set() *Set {
46 return v.set
47 }
48
49 func (v versionedSet) APIVersion() APIVersion {
50 return v.apiVersion
51 }
52
53 func (v versionedSet) Applied() bool {
54 return v.applied
55 }
56
57
58
59 type ManagedFields map[string]VersionedSet
60
61
62
63 func (lhs ManagedFields) Equals(rhs ManagedFields) bool {
64 if len(lhs) != len(rhs) {
65 return false
66 }
67
68 for manager, left := range lhs {
69 right, ok := rhs[manager]
70 if !ok {
71 return false
72 }
73 if left.APIVersion() != right.APIVersion() || left.Applied() != right.Applied() {
74 return false
75 }
76 if !left.Set().Equals(right.Set()) {
77 return false
78 }
79 }
80 return true
81 }
82
83
84 func (lhs ManagedFields) Copy() ManagedFields {
85 copy := ManagedFields{}
86 for manager, set := range lhs {
87 copy[manager] = set
88 }
89 return copy
90 }
91
92
93
94
95
96 func (lhs ManagedFields) Difference(rhs ManagedFields) ManagedFields {
97 diff := ManagedFields{}
98
99 for manager, left := range lhs {
100 right, ok := rhs[manager]
101 if !ok {
102 if !left.Set().Empty() {
103 diff[manager] = left
104 }
105 continue
106 }
107
108
109
110
111 if left.APIVersion() != right.APIVersion() {
112 diff[manager] = right
113 continue
114 }
115
116 newSet := left.Set().Difference(right.Set()).Union(right.Set().Difference(left.Set()))
117 if !newSet.Empty() {
118 diff[manager] = NewVersionedSet(newSet, right.APIVersion(), false)
119 }
120 }
121
122 for manager, set := range rhs {
123 if _, ok := lhs[manager]; ok {
124
125 continue
126 }
127 if !set.Set().Empty() {
128 diff[manager] = set
129 }
130 }
131
132 return diff
133 }
134
135 func (lhs ManagedFields) String() string {
136 s := strings.Builder{}
137 for k, v := range lhs {
138 fmt.Fprintf(&s, "%s:\n", k)
139 fmt.Fprintf(&s, "- Applied: %v\n", v.Applied())
140 fmt.Fprintf(&s, "- APIVersion: %v\n", v.APIVersion())
141 fmt.Fprintf(&s, "- Set: %v\n", v.Set())
142 }
143 return s.String()
144 }
145
View as plain text