...
1
16
17 package cli
18
19 import (
20 "fmt"
21 "io"
22 "io/ioutil"
23
24 "sigs.k8s.io/structured-merge-diff/v4/typed"
25 "sigs.k8s.io/structured-merge-diff/v4/value"
26 )
27
28 type Operation interface {
29 Execute(io.Writer) error
30 }
31
32 type operationBase struct {
33 parser *typed.Parser
34 typeName string
35 }
36
37 func (b operationBase) parseFile(path string) (tv *typed.TypedValue, err error) {
38 bytes, err := ioutil.ReadFile(path)
39 if err != nil {
40 return tv, fmt.Errorf("unable to read file %q: %v", path, err)
41 }
42 tv, err = b.parser.Type(b.typeName).FromYAML(typed.YAMLObject(bytes))
43 if err != nil {
44 return tv, fmt.Errorf("unable to validate file %q:\n%v", path, err)
45 }
46 return tv, nil
47 }
48
49 type validation struct {
50 operationBase
51
52 fileToValidate string
53 }
54
55 func (v validation) Execute(_ io.Writer) error {
56 _, err := v.parseFile(v.fileToValidate)
57 return err
58 }
59
60 type fieldset struct {
61 operationBase
62
63 fileToUse string
64 }
65
66 func (f fieldset) Execute(w io.Writer) error {
67 tv, err := f.parseFile(f.fileToUse)
68 if err != nil {
69 return err
70 }
71
72 empty, err := f.parser.Type(f.typeName).FromYAML(typed.YAMLObject("{}"))
73 if err != nil {
74 return err
75 }
76 c, err := empty.Compare(tv)
77 if err != nil {
78 return err
79 }
80
81 return c.Added.ToJSONStream(w)
82 }
83
84 type listTypes struct {
85 operationBase
86 }
87
88 func (l listTypes) Execute(w io.Writer) error {
89 for _, td := range l.parser.Schema.Types {
90 fmt.Fprintf(w, "%v\n", td.Name)
91 }
92 return nil
93 }
94
95 type merge struct {
96 operationBase
97
98 lhs string
99 rhs string
100 }
101
102 func (m merge) Execute(w io.Writer) error {
103 lhs, err := m.parseFile(m.lhs)
104 if err != nil {
105 return err
106 }
107 rhs, err := m.parseFile(m.rhs)
108 if err != nil {
109 return err
110 }
111
112 out, err := lhs.Merge(rhs)
113 if err != nil {
114 return err
115 }
116
117 yaml, err := value.ToYAML(out.AsValue())
118 if err != nil {
119 return err
120 }
121 _, err = w.Write(yaml)
122
123 return err
124 }
125
126 type compare struct {
127 operationBase
128
129 lhs string
130 rhs string
131 }
132
133 func (c compare) Execute(w io.Writer) error {
134 lhs, err := c.parseFile(c.lhs)
135 if err != nil {
136 return err
137 }
138 rhs, err := c.parseFile(c.rhs)
139 if err != nil {
140 return err
141 }
142
143 got, err := lhs.Compare(rhs)
144 if err != nil {
145 return err
146 }
147
148 if got.IsSame() {
149 _, err = fmt.Fprint(w, "No difference")
150 return err
151 }
152
153
154
155
156 _, err = fmt.Fprintf(w, got.String())
157
158 return err
159 }
160
View as plain text