summaryrefslogtreecommitdiff
path: root/vendor/sigs.k8s.io/structured-merge-diff/v3/value/fields.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/sigs.k8s.io/structured-merge-diff/v3/value/fields.go')
-rw-r--r--vendor/sigs.k8s.io/structured-merge-diff/v3/value/fields.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/vendor/sigs.k8s.io/structured-merge-diff/v3/value/fields.go b/vendor/sigs.k8s.io/structured-merge-diff/v3/value/fields.go
new file mode 100644
index 000000000..be3c67249
--- /dev/null
+++ b/vendor/sigs.k8s.io/structured-merge-diff/v3/value/fields.go
@@ -0,0 +1,97 @@
+/*
+Copyright 2019 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package value
+
+import (
+ "sort"
+ "strings"
+)
+
+// Field is an individual key-value pair.
+type Field struct {
+ Name string
+ Value Value
+}
+
+// FieldList is a list of key-value pairs. Each field is expected to
+// have a different name.
+type FieldList []Field
+
+// Sort sorts the field list by Name.
+func (f FieldList) Sort() {
+ if len(f) < 2 {
+ return
+ }
+ if len(f) == 2 {
+ if f[1].Name < f[0].Name {
+ f[0], f[1] = f[1], f[0]
+ }
+ return
+ }
+ sort.SliceStable(f, func(i, j int) bool {
+ return f[i].Name < f[j].Name
+ })
+}
+
+// Less compares two lists lexically.
+func (f FieldList) Less(rhs FieldList) bool {
+ return f.Compare(rhs) == -1
+}
+
+// Compare compares two lists lexically. The result will be 0 if f==rhs, -1
+// if f < rhs, and +1 if f > rhs.
+func (f FieldList) Compare(rhs FieldList) int {
+ i := 0
+ for {
+ if i >= len(f) && i >= len(rhs) {
+ // Maps are the same length and all items are equal.
+ return 0
+ }
+ if i >= len(f) {
+ // F is shorter.
+ return -1
+ }
+ if i >= len(rhs) {
+ // RHS is shorter.
+ return 1
+ }
+ if c := strings.Compare(f[i].Name, rhs[i].Name); c != 0 {
+ return c
+ }
+ if c := Compare(f[i].Value, rhs[i].Value); c != 0 {
+ return c
+ }
+ // The items are equal; continue.
+ i++
+ }
+}
+
+// Equals returns true if the two fieldslist are equals, false otherwise.
+func (f FieldList) Equals(rhs FieldList) bool {
+ if len(f) != len(rhs) {
+ return false
+ }
+ for i := range f {
+ if f[i].Name != rhs[i].Name {
+ return false
+ }
+ if !Equals(f[i].Value, rhs[i].Value) {
+ return false
+ }
+ }
+ return true
+}