@@ -13,8 +13,8 @@ import (
1313 "sync"
1414
1515 sys "github.com/8bitalex/raid/src/internal/sys"
16- "github.com/8bitalex/raid/src/internal/utils"
1716 "github.com/santhosh-tekuri/jsonschema/v6"
17+ "gopkg.in/yaml.v3"
1818)
1919
2020//go:embed schemas/*.json
@@ -207,21 +207,38 @@ func validateFile(path string, sch *jsonschema.Schema) error {
207207 }
208208 defer f .Close ()
209209
210- var reader io.Reader = f
211210 ext := strings .ToLower (filepath .Ext (path ))
212211 if ext == ".yaml" || ext == ".yml" {
213- data , err := utils .YAMLToJSON (f )
214- if err != nil {
215- return err
212+ // Validate every document in a multi-doc YAML stream individually so
213+ // that profile files using --- separators are fully validated.
214+ dec := yaml .NewDecoder (f )
215+ for {
216+ var raw any
217+ if err := dec .Decode (& raw ); err != nil {
218+ if err == io .EOF {
219+ break
220+ }
221+ return err
222+ }
223+ jsonBytes , err := json .Marshal (raw )
224+ if err != nil {
225+ return err
226+ }
227+ doc , err := jsonschema .UnmarshalJSON (bytes .NewReader (jsonBytes ))
228+ if err != nil {
229+ return err
230+ }
231+ if err := sch .Validate (doc ); err != nil {
232+ return fmt .Errorf ("invalid format: %w" , err )
233+ }
216234 }
217- reader = bytes . NewReader ( data )
235+ return nil
218236 }
219237
220- doc , err := jsonschema .UnmarshalJSON (reader )
238+ doc , err := jsonschema .UnmarshalJSON (f )
221239 if err != nil {
222240 return err
223241 }
224-
225242 if err := sch .Validate (doc ); err != nil {
226243 return fmt .Errorf ("invalid format: %w" , err )
227244 }
0 commit comments