@@ -89,7 +89,7 @@ func validateCoderResourceIconURL(iconURL string) []error {
89
89
return []error {xerrors .New ("icon URL cannot be empty" )}
90
90
}
91
91
92
- errs := []error {}
92
+ var errs []error
93
93
94
94
// If the URL does not have a relative path.
95
95
if ! strings .HasPrefix (iconURL , "." ) && ! strings .HasPrefix (iconURL , "/" ) {
@@ -120,7 +120,7 @@ func validateCoderResourceTags(tags []string) error {
120
120
121
121
// All of these tags are used for the module/template filter controls in the Registry site. Need to make sure they
122
122
// can all be placed in the browser URL without issue.
123
- invalidTags := []string {}
123
+ var invalidTags []string
124
124
for _ , t := range tags {
125
125
if t != url .QueryEscape (t ) {
126
126
invalidTags = append (invalidTags , t )
@@ -133,7 +133,7 @@ func validateCoderResourceTags(tags []string) error {
133
133
return nil
134
134
}
135
135
136
- func validateCoderResourceReadmeBody (body string ) []error {
136
+ func validateCoderModuleReadmeBody (body string ) []error {
137
137
var errs []error
138
138
139
139
trimmed := strings .TrimSpace (body )
@@ -213,33 +213,88 @@ func validateCoderResourceReadmeBody(body string) []error {
213
213
return errs
214
214
}
215
215
216
- func validateCoderResourceReadme (rm coderResourceReadme ) []error {
217
- var errs []error
216
+ func validateCoderResourceFrontmatter (resourceType string , filePath string , fm coderResourceFrontmatter ) []error {
217
+ if ! slices .Contains (supportedResourceTypes , resourceType ) {
218
+ return []error {xerrors .Errorf ("cannot process unknown resource type %q" , resourceType )}
219
+ }
218
220
219
- for _ , err := range validateCoderResourceReadmeBody (rm .body ) {
220
- errs = append (errs , addFilePathToError (rm .filePath , err ))
221
+ var errs []error
222
+ if err := validateCoderResourceDisplayName (fm .DisplayName ); err != nil {
223
+ errs = append (errs , addFilePathToError (filePath , err ))
224
+ }
225
+ if err := validateCoderResourceDescription (fm .Description ); err != nil {
226
+ errs = append (errs , addFilePathToError (filePath , err ))
227
+ }
228
+ if err := validateCoderResourceTags (fm .Tags ); err != nil {
229
+ errs = append (errs , addFilePathToError (filePath , err ))
221
230
}
222
231
223
- if err := validateCoderResourceDisplayName ( rm . frontmatter . DisplayName ); err != nil {
224
- errs = append (errs , addFilePathToError (rm . filePath , err ))
232
+ for _ , err := range validateCoderResourceIconURL ( fm . IconURL ) {
233
+ errs = append (errs , addFilePathToError (filePath , err ))
225
234
}
226
- if err := validateCoderResourceDescription ( rm . frontmatter . Description ); err != nil {
227
- errs = append (errs , addFilePathToError (rm . filePath , err ))
235
+ for _ , err := range validateSupportedOperatingSystems ( fm . OperatingSystems ) {
236
+ errs = append (errs , addFilePathToError (filePath , err ))
228
237
}
229
- if err := validateCoderResourceTags (rm .frontmatter .Tags ); err != nil {
238
+
239
+ return errs
240
+ }
241
+
242
+ func validateCoderModuleReadme (rm coderResourceReadme ) []error {
243
+ var errs []error
244
+ for _ , err := range validateCoderModuleReadmeBody (rm .body ) {
230
245
errs = append (errs , addFilePathToError (rm .filePath , err ))
231
246
}
247
+ if fmErrs := validateCoderResourceFrontmatter ("modules" , rm .filePath , rm .frontmatter ); len (fmErrs ) != 0 {
248
+ errs = append (errs , fmErrs ... )
249
+ }
250
+ return errs
251
+ }
232
252
233
- for _ , err := range validateCoderResourceIconURL (rm .frontmatter .IconURL ) {
234
- errs = append (errs , addFilePathToError (rm .filePath , err ))
253
+ func validateAllCoderModuleReadmes (resources []coderResourceReadme ) error {
254
+ var yamlValidationErrors []error
255
+ for _ , readme := range resources {
256
+ errs := validateCoderModuleReadme (readme )
257
+ if len (errs ) > 0 {
258
+ yamlValidationErrors = append (yamlValidationErrors , errs ... )
259
+ }
235
260
}
236
- for _ , err := range validateSupportedOperatingSystems (rm .frontmatter .OperatingSystems ) {
237
- errs = append (errs , addFilePathToError (rm .filePath , err ))
261
+ if len (yamlValidationErrors ) != 0 {
262
+ return validationPhaseError {
263
+ phase : validationPhaseReadme ,
264
+ errors : yamlValidationErrors ,
265
+ }
238
266
}
267
+ return nil
268
+ }
239
269
270
+ func validateCoderTemplateReadme (rm coderResourceReadme ) []error {
271
+ var errs []error
272
+ // for _, err := range validateCoderResourceReadmeBody(rm.body) {
273
+ // errs = append(errs, addFilePathToError(rm.filePath, err))
274
+ // }
275
+ if fmErrs := validateCoderResourceFrontmatter ("modules" , rm .filePath , rm .frontmatter ); len (fmErrs ) != 0 {
276
+ errs = append (errs , fmErrs ... )
277
+ }
240
278
return errs
241
279
}
242
280
281
+ func validateAllCoderTemplateReadmes (resources []coderResourceReadme ) error {
282
+ var yamlValidationErrors []error
283
+ for _ , readme := range resources {
284
+ errs := validateCoderTemplateReadme (readme )
285
+ if len (errs ) > 0 {
286
+ yamlValidationErrors = append (yamlValidationErrors , errs ... )
287
+ }
288
+ }
289
+ if len (yamlValidationErrors ) != 0 {
290
+ return validationPhaseError {
291
+ phase : validationPhaseReadme ,
292
+ errors : yamlValidationErrors ,
293
+ }
294
+ }
295
+ return nil
296
+ }
297
+
243
298
func parseCoderResourceReadme (resourceType string , rm readme ) (coderResourceReadme , []error ) {
244
299
fm , body , err := separateFrontmatter (rm .rawText )
245
300
if err != nil {
@@ -248,7 +303,7 @@ func parseCoderResourceReadme(resourceType string, rm readme) (coderResourceRead
248
303
249
304
keyErrs := validateFrontmatterYamlKeys (fm , supportedCoderResourceStructKeys )
250
305
if len (keyErrs ) != 0 {
251
- remapped := []error {}
306
+ var remapped []error
252
307
for _ , e := range keyErrs {
253
308
remapped = append (remapped , addFilePathToError (rm .filePath , e ))
254
309
}
@@ -268,7 +323,7 @@ func parseCoderResourceReadme(resourceType string, rm readme) (coderResourceRead
268
323
}, nil
269
324
}
270
325
271
- func parseCoderResourceReadmeFiles (resourceType string , rms []readme ) (map [ string ]coderResourceReadme , error ) {
326
+ func parseCoderResourceReadmeFiles (resourceType string , rms []readme ) ([ ]coderResourceReadme , error ) {
272
327
if ! slices .Contains (supportedResourceTypes , resourceType ) {
273
328
return nil , xerrors .Errorf ("cannot process unknown resource type %q" , resourceType )
274
329
}
@@ -291,26 +346,19 @@ func parseCoderResourceReadmeFiles(resourceType string, rms []readme) (map[strin
291
346
}
292
347
}
293
348
294
- yamlValidationErrors := []error {}
295
- for _ , readme := range resources {
296
- errs := validateCoderResourceReadme (readme )
297
- if len (errs ) > 0 {
298
- yamlValidationErrors = append (yamlValidationErrors , errs ... )
299
- }
300
- }
301
- if len (yamlValidationErrors ) != 0 {
302
- return nil , validationPhaseError {
303
- phase : validationPhaseReadme ,
304
- errors : yamlValidationErrors ,
305
- }
349
+ var serialized []coderResourceReadme
350
+ for _ , r := range resources {
351
+ serialized = append (serialized , r )
306
352
}
307
-
308
- return resources , nil
353
+ slices .SortFunc (serialized , func (r1 coderResourceReadme , r2 coderResourceReadme ) int {
354
+ return strings .Compare (r1 .filePath , r2 .filePath )
355
+ })
356
+ return serialized , nil
309
357
}
310
358
311
359
// Todo: Need to beef up this function by grabbing each image/video URL from
312
360
// the body's AST.
313
- func validateCoderResourceRelativeURLs (_ map [ string ]coderResourceReadme ) error {
361
+ func validateCoderResourceRelativeURLs (_ [ ]coderResourceReadme ) error {
314
362
return nil
315
363
}
316
364
@@ -380,6 +428,10 @@ func validateAllCoderModules() error {
380
428
if err != nil {
381
429
return err
382
430
}
431
+ err = validateAllCoderModuleReadmes (resources )
432
+ if err != nil {
433
+ return err
434
+ }
383
435
logger .Info (context .Background (), "processed README files as valid Coder resources" , "resource_type" , resourceType , "num_files" , len (resources ))
384
436
385
437
if err := validateCoderResourceRelativeURLs (resources ); err != nil {
@@ -401,6 +453,10 @@ func validateAllCoderTemplates() error {
401
453
if err != nil {
402
454
return err
403
455
}
456
+ err = validateAllCoderTemplateReadmes (resources )
457
+ if err != nil {
458
+ return err
459
+ }
404
460
logger .Info (context .Background (), "processed README files as valid Coder resources" , "resource_type" , resourceType , "num_files" , len (resources ))
405
461
406
462
if err := validateCoderResourceRelativeURLs (resources ); err != nil {
0 commit comments