mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-18 06:25:20 +00:00
84 lines
1.6 KiB
Go
84 lines
1.6 KiB
Go
package yamlpatch
|
|
|
|
import "reflect"
|
|
|
|
// Node holds a YAML document that has not yet been processed into a NodeMap or
|
|
// NodeSlice
|
|
type Node struct {
|
|
raw *interface{}
|
|
container Container
|
|
}
|
|
|
|
// NewNode returns a new Node. It expects a pointer to an interface{}
|
|
func NewNode(raw *interface{}) *Node {
|
|
return &Node{
|
|
raw: raw,
|
|
}
|
|
}
|
|
|
|
// MarshalYAML implements yaml.Marshaler, and returns the correct interface{}
|
|
// to be marshaled
|
|
func (n *Node) MarshalYAML() (interface{}, error) {
|
|
if n.container != nil {
|
|
return n.container, nil
|
|
}
|
|
|
|
return *n.raw, nil
|
|
}
|
|
|
|
// UnmarshalYAML implements yaml.Unmarshaler
|
|
func (n *Node) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
|
var data interface{}
|
|
|
|
err := unmarshal(&data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
n.raw = &data
|
|
return nil
|
|
}
|
|
|
|
// Empty returns whether the raw value is nil
|
|
func (n *Node) Empty() bool {
|
|
return *n.raw == nil
|
|
}
|
|
|
|
// Container returns the node as a Container
|
|
func (n *Node) Container() Container {
|
|
if n.container != nil {
|
|
return n.container
|
|
}
|
|
|
|
switch rt := (*n.raw).(type) {
|
|
case []interface{}:
|
|
c := make(nodeSlice, len(rt))
|
|
n.container = &c
|
|
|
|
for i := range rt {
|
|
c[i] = NewNode(&rt[i])
|
|
}
|
|
case map[interface{}]interface{}:
|
|
c := make(nodeMap, len(rt))
|
|
n.container = &c
|
|
|
|
for k := range rt {
|
|
v := rt[k]
|
|
c[k] = NewNode(&v)
|
|
}
|
|
}
|
|
|
|
return n.container
|
|
}
|
|
|
|
// Equal compares the values of the raw interfaces that the YAML was
|
|
// unmarshaled into
|
|
func (n *Node) Equal(other *Node) bool {
|
|
return reflect.DeepEqual(*n.raw, *other.raw)
|
|
}
|
|
|
|
// Value returns the raw value of the node
|
|
func (n *Node) Value() interface{} {
|
|
return *n.raw
|
|
}
|