@@ -3,11 +3,10 @@ package command
33import (
44 "fmt"
55
6- "github.com/goccy/go-yaml"
7-
86 "github.com/macropower/kat/pkg/execs"
97 "github.com/macropower/kat/pkg/profile"
108 "github.com/macropower/kat/pkg/rule"
9+ "github.com/macropower/kat/pkg/yaml"
1110)
1211
1312const (
@@ -106,15 +105,6 @@ type Config struct {
106105 Rules []* rule.Rule `json:"rules,omitempty" jsonschema:"title=Rules"`
107106}
108107
109- type ConfigError struct {
110- Path * yaml.Path // YAML path to the error.
111- Err error
112- }
113-
114- func (e ConfigError ) Error () string {
115- return fmt .Sprintf ("error at %s: %v" , e .Path .String (), e .Err )
116- }
117-
118108func NewConfig (ps map [string ]* profile.Profile , rs []* rule.Rule ) (* Config , error ) {
119109 c := & Config {
120110 Profiles : ps ,
@@ -146,16 +136,16 @@ func (c *Config) EnsureDefaults() {
146136 }
147137}
148138
149- func (c * Config ) Validate () * ConfigError {
150- pb := yaml.PathBuilder {}
139+ func (c * Config ) Validate () error {
140+ pb := yaml .NewPathBuilder ()
151141
152142 for name , p := range c .Profiles {
153143 err := p .CompileSource ()
154144 if err != nil {
155- return & ConfigError {
156- Path : pb . Root (). Child ( "profiles" ). Child ( name ). Child ( " source" ). Build ( ),
157- Err : fmt . Errorf ( "invalid source: %w" , err ),
158- }
145+ return yaml . NewError (
146+ fmt . Errorf ( "invalid source for profile %q: %w" , name , err ),
147+ yaml . WithPath ( pb . Root (). Child ( "profiles" ). Child ( name ). Child ( " source" ). Build () ),
148+ )
159149 }
160150
161151 for i , env := range p .Command .Env {
@@ -166,18 +156,18 @@ func (c *Config) Validate() *ConfigError {
166156 uIdx := uint (i ) //nolint:gosec // G115: integer overflow conversion int -> uint.
167157 err := env .ValueFrom .CallerRef .Compile ()
168158 if err != nil {
169- return & ConfigError {
170- Path : pb .Root ().
159+ return yaml .NewError (
160+ fmt .Errorf ("invalid env pattern: %w" , err ),
161+ yaml .WithPath (pb .Root ().
171162 Child ("profiles" ).
172163 Child (name ).
173164 Child ("env" ).
174165 Index (uIdx ).
175166 Child ("valueFrom" ).
176167 Child ("callerRef" ).
177168 Child ("pattern" ).
178- Build (),
179- Err : fmt .Errorf ("invalid env pattern: %w" , err ),
180- }
169+ Build ()),
170+ )
181171 }
182172 }
183173
@@ -189,45 +179,45 @@ func (c *Config) Validate() *ConfigError {
189179 uIdx := uint (i ) //nolint:gosec // G115: integer overflow conversion int -> uint.
190180 err := envFrom .CallerRef .Compile ()
191181 if err != nil {
192- return & ConfigError {
193- Path : pb .Root ().
182+ return yaml .NewError (
183+ fmt .Errorf ("invalid envFrom pattern: %w" , err ),
184+ yaml .WithPath (pb .Root ().
194185 Child ("profiles" ).
195186 Child (name ).
196187 Child ("envFrom" ).
197188 Index (uIdx ).
198189 Child ("callerRef" ).
199190 Child ("pattern" ).
200- Build (),
201- Err : fmt .Errorf ("invalid envFrom pattern: %w" , err ),
202- }
191+ Build ()),
192+ )
203193 }
204194 }
205195 // TODO: Build should return *ConfigError to avoid the duplicate validation above.
206196 err = p .Build ()
207197 if err != nil {
208- return & ConfigError {
209- Path : pb . Root (). Child ( "profiles" ). Child ( name ). Build ( ),
210- Err : fmt . Errorf ( "invalid profile: %w" , err ),
211- }
198+ return yaml . NewError (
199+ fmt . Errorf ( "invalid profile: %w" , err ),
200+ yaml . WithPath ( pb . Root (). Child ( "profiles" ). Child ( name ). Build () ),
201+ )
212202 }
213203 }
214204
215205 for i , r := range c .Rules {
216206 uIdx := uint (i ) //nolint:gosec // G115: integer overflow conversion int -> uint.
217207 err := r .CompileMatch ()
218208 if err != nil {
219- return & ConfigError {
220- Path : pb . Root (). Child ( "rules" ). Index ( uIdx ). Child ( " match" ). Build ( ),
221- Err : fmt . Errorf ( "invalid match: %w" , err ),
222- }
209+ return yaml . NewError (
210+ fmt . Errorf ( "invalid match: %w" , err ),
211+ yaml . WithPath ( pb . Root (). Child ( "rules" ). Index ( uIdx ). Child ( " match" ). Build () ),
212+ )
223213 }
224214
225215 p , ok := c .Profiles [r .Profile ]
226216 if ! ok {
227- return & ConfigError {
228- Path : pb . Root (). Child ( "rules" ). Index ( uIdx ). Child ( " profile" ). Build ( ),
229- Err : fmt . Errorf ( " profile %q not found" , r . Profile ),
230- }
217+ return yaml . NewError (
218+ fmt . Errorf ( " profile %q not found" , r . Profile ),
219+ yaml . WithPath ( pb . Root (). Child ( "rules" ). Index ( uIdx ). Child ( " profile" ). Build () ),
220+ )
231221 }
232222
233223 r .SetProfile (p )
0 commit comments