@@ -89,7 +89,7 @@ func validateCoderResourceIconURL(iconURL string) []error {
8989 return []error {xerrors .New ("icon URL cannot be empty" )}
9090 }
9191
92- errs := []error {}
92+ var errs []error
9393
9494 // If the URL does not have a relative path.
9595 if ! strings .HasPrefix (iconURL , "." ) && ! strings .HasPrefix (iconURL , "/" ) {
@@ -120,7 +120,7 @@ func validateCoderResourceTags(tags []string) error {
120120
121121 // All of these tags are used for the module/template filter controls in the Registry site. Need to make sure they
122122 // can all be placed in the browser URL without issue.
123- invalidTags := []string {}
123+ var invalidTags []string
124124 for _ , t := range tags {
125125 if t != url .QueryEscape (t ) {
126126 invalidTags = append (invalidTags , t )
@@ -133,7 +133,7 @@ func validateCoderResourceTags(tags []string) error {
133133 return nil
134134}
135135
136- func validateCoderResourceReadmeBody (body string ) []error {
136+ func validateCoderModuleReadmeBody (body string ) []error {
137137 var errs []error
138138
139139 trimmed := strings .TrimSpace (body )
@@ -213,33 +213,88 @@ func validateCoderResourceReadmeBody(body string) []error {
213213 return errs
214214}
215215
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+ }
218220
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 ))
221230 }
222231
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 ))
225234 }
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 ))
228237 }
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 ) {
230245 errs = append (errs , addFilePathToError (rm .filePath , err ))
231246 }
247+ if fmErrs := validateCoderResourceFrontmatter ("modules" , rm .filePath , rm .frontmatter ); len (fmErrs ) != 0 {
248+ errs = append (errs , fmErrs ... )
249+ }
250+ return errs
251+ }
232252
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+ }
235260 }
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+ }
238266 }
267+ return nil
268+ }
239269
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+ }
240278 return errs
241279}
242280
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+
243298func parseCoderResourceReadme (resourceType string , rm readme ) (coderResourceReadme , []error ) {
244299 fm , body , err := separateFrontmatter (rm .rawText )
245300 if err != nil {
@@ -248,7 +303,7 @@ func parseCoderResourceReadme(resourceType string, rm readme) (coderResourceRead
248303
249304 keyErrs := validateFrontmatterYamlKeys (fm , supportedCoderResourceStructKeys )
250305 if len (keyErrs ) != 0 {
251- remapped := []error {}
306+ var remapped []error
252307 for _ , e := range keyErrs {
253308 remapped = append (remapped , addFilePathToError (rm .filePath , e ))
254309 }
@@ -268,7 +323,7 @@ func parseCoderResourceReadme(resourceType string, rm readme) (coderResourceRead
268323 }, nil
269324}
270325
271- func parseCoderResourceReadmeFiles (resourceType string , rms []readme ) (map [ string ]coderResourceReadme , error ) {
326+ func parseCoderResourceReadmeFiles (resourceType string , rms []readme ) ([ ]coderResourceReadme , error ) {
272327 if ! slices .Contains (supportedResourceTypes , resourceType ) {
273328 return nil , xerrors .Errorf ("cannot process unknown resource type %q" , resourceType )
274329 }
@@ -291,26 +346,19 @@ func parseCoderResourceReadmeFiles(resourceType string, rms []readme) (map[strin
291346 }
292347 }
293348
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 )
306352 }
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
309357}
310358
311359// Todo: Need to beef up this function by grabbing each image/video URL from
312360// the body's AST.
313- func validateCoderResourceRelativeURLs (_ map [ string ]coderResourceReadme ) error {
361+ func validateCoderResourceRelativeURLs (_ [ ]coderResourceReadme ) error {
314362 return nil
315363}
316364
@@ -380,6 +428,10 @@ func validateAllCoderModules() error {
380428 if err != nil {
381429 return err
382430 }
431+ err = validateAllCoderModuleReadmes (resources )
432+ if err != nil {
433+ return err
434+ }
383435 logger .Info (context .Background (), "processed README files as valid Coder resources" , "resource_type" , resourceType , "num_files" , len (resources ))
384436
385437 if err := validateCoderResourceRelativeURLs (resources ); err != nil {
@@ -401,6 +453,10 @@ func validateAllCoderTemplates() error {
401453 if err != nil {
402454 return err
403455 }
456+ err = validateAllCoderTemplateReadmes (resources )
457+ if err != nil {
458+ return err
459+ }
404460 logger .Info (context .Background (), "processed README files as valid Coder resources" , "resource_type" , resourceType , "num_files" , len (resources ))
405461
406462 if err := validateCoderResourceRelativeURLs (resources ); err != nil {
0 commit comments