...
1
2
3
4 package filtersutil
5
6 import (
7 "encoding/json"
8
9 "sigs.k8s.io/kustomize/kyaml/errors"
10 "sigs.k8s.io/kustomize/kyaml/kio"
11 "sigs.k8s.io/kustomize/kyaml/yaml"
12 )
13
14
15
16
17
18
19
20
21 func ApplyToJSON(filter kio.Filter, objs ...marshalerUnmarshaler) error {
22 var nodes []*yaml.RNode
23
24
25 for i := range objs {
26 node, err := GetRNode(objs[i])
27 if err != nil {
28 return err
29 }
30 nodes = append(nodes, node)
31 }
32
33
34 nodes, err := filter.Filter(nodes)
35 if err != nil {
36 return err
37 }
38 if len(nodes) != len(objs) {
39 return errors.Errorf("filter cannot create or delete objects")
40 }
41
42
43 for i := range nodes {
44 err = setRNode(objs[i], nodes[i])
45 if err != nil {
46 return err
47 }
48 }
49
50 return nil
51 }
52
53 type marshalerUnmarshaler interface {
54 json.Unmarshaler
55 json.Marshaler
56 }
57
58
59 func GetRNode(k json.Marshaler) (*yaml.RNode, error) {
60 j, err := k.MarshalJSON()
61 if err != nil {
62 return nil, err
63 }
64 return yaml.Parse(string(j))
65 }
66
67
68 func setRNode(k json.Unmarshaler, node *yaml.RNode) error {
69 s, err := node.String()
70 if err != nil {
71 return err
72 }
73 m := map[string]interface{}{}
74 if err := yaml.Unmarshal([]byte(s), &m); err != nil {
75 return err
76 }
77
78 b, err := json.Marshal(m)
79 if err != nil {
80 return err
81 }
82 return k.UnmarshalJSON(b)
83 }
84
View as plain text