diff --git a/kyaml/yaml/mapnode.go b/kyaml/yaml/mapnode.go new file mode 100644 index 000000000..31b41b40f --- /dev/null +++ b/kyaml/yaml/mapnode.go @@ -0,0 +1,40 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +// MapNode wraps a field key and value. +type MapNode struct { + Key *RNode + Value *RNode +} + +// IsNilOrEmpty returns true if the MapNode is nil, +// has no value, or has a value that appears empty. +func (mn *MapNode) IsNilOrEmpty() bool { + return mn == nil || mn.Value.IsNilOrEmpty() +} + +type MapNodeSlice []*MapNode + +func (m MapNodeSlice) Keys() []*RNode { + var keys []*RNode + for i := range m { + if m[i] != nil { + keys = append(keys, m[i].Key) + } + } + return keys +} + +func (m MapNodeSlice) Values() []*RNode { + var values []*RNode + for i := range m { + if m[i] != nil { + values = append(values, m[i].Value) + } else { + values = append(values, nil) + } + } + return values +} diff --git a/kyaml/yaml/mapnode_test.go b/kyaml/yaml/mapnode_test.go new file mode 100644 index 000000000..9b76523c3 --- /dev/null +++ b/kyaml/yaml/mapnode_test.go @@ -0,0 +1,51 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "testing" +) + +func TestMapNodeIsNilOrEmpty(t *testing.T) { + var mn *MapNode + + if !mn.IsNilOrEmpty() { + t.Fatalf("nil should be empty") + } + + mn = &MapNode{Key: MakeNullNode()} + if !mn.IsNilOrEmpty() { + t.Fatalf("missing value should be empty") + } + + mn.Value = NewRNode(nil) + if !mn.IsNilOrEmpty() { + t.Fatalf("missing value YNode should be empty") + } + + mn.Value = MakeNullNode() + if !mn.IsNilOrEmpty() { + t.Fatalf("value tagged null should be empty") + } + + mn.Value = NewMapRNode(nil) + if !mn.IsNilOrEmpty() { + t.Fatalf("empty map should be empty") + } + + mn.Value = NewMapRNode(&map[string]string{"foo": "bar"}) + if mn.IsNilOrEmpty() { + t.Fatalf("non-empty map should not be empty") + } + + mn.Value = NewListRNode() + if !mn.IsNilOrEmpty() { + t.Fatalf("empty list should be empty") + } + + mn.Value = NewListRNode("foo") + if mn.IsNilOrEmpty() { + t.Fatalf("non-empty list should not be empty") + } +} diff --git a/kyaml/yaml/types.go b/kyaml/yaml/types.go index a19e30df9..59ef220f4 100644 --- a/kyaml/yaml/types.go +++ b/kyaml/yaml/types.go @@ -88,42 +88,6 @@ func (f FilterFunc) Filter(object *RNode) (*RNode, error) { return f(object) } -// MapNode wraps a field key and value. -type MapNode struct { - Key *RNode - Value *RNode -} - -// IsNilOrEmpty returns true if the MapNode is nil, -// has no value, or has a value that appears empty. -func (mn *MapNode) IsNilOrEmpty() bool { - return mn == nil || mn.Value.IsNilOrEmpty() -} - -type MapNodeSlice []*MapNode - -func (m MapNodeSlice) Keys() []*RNode { - var keys []*RNode - for i := range m { - if m[i] != nil { - keys = append(keys, m[i].Key) - } - } - return keys -} - -func (m MapNodeSlice) Values() []*RNode { - var values []*RNode - for i := range m { - if m[i] != nil { - values = append(values, m[i].Value) - } else { - values = append(values, nil) - } - } - return values -} - type TypeMeta struct { Kind string APIVersion string diff --git a/kyaml/yaml/types_test.go b/kyaml/yaml/types_test.go index 14ad7dd6e..1bf8c96a5 100644 --- a/kyaml/yaml/types_test.go +++ b/kyaml/yaml/types_test.go @@ -61,46 +61,3 @@ func TestIsYNodeEmptySeq(t *testing.T) { t.Fatalf("a node with content isn't empty") } } - -func TestMapNodeIsNilOrEmpty(t *testing.T) { - var mn *MapNode - - if !mn.IsNilOrEmpty() { - t.Fatalf("nil should be empty") - } - - mn = &MapNode{Key: MakeNullNode()} - if !mn.IsNilOrEmpty() { - t.Fatalf("missing value should be empty") - } - - mn.Value = NewRNode(nil) - if !mn.IsNilOrEmpty() { - t.Fatalf("missing value YNode should be empty") - } - - mn.Value = MakeNullNode() - if !mn.IsNilOrEmpty() { - t.Fatalf("value tagged null should be empty") - } - - mn.Value = NewMapRNode(nil) - if !mn.IsNilOrEmpty() { - t.Fatalf("empty map should be empty") - } - - mn.Value = NewMapRNode(&map[string]string{"foo": "bar"}) - if mn.IsNilOrEmpty() { - t.Fatalf("non-empty map should not be empty") - } - - mn.Value = NewListRNode() - if !mn.IsNilOrEmpty() { - t.Fatalf("empty list should be empty") - } - - mn.Value = NewListRNode("foo") - if mn.IsNilOrEmpty() { - t.Fatalf("non-empty list should not be empty") - } -}