code/go/internal/validator/folder_item_spec.go (51 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
package validator
import (
"fmt"
"io/fs"
"regexp"
"github.com/elastic/package-spec/v3/code/go/internal/spectypes"
"github.com/elastic/package-spec/v3/code/go/pkg/specerrors"
)
func matchingFileExists(spec spectypes.ItemSpec, files []fs.DirEntry) (bool, error) {
if spec.Name() != "" {
for _, file := range files {
_, fileName := checkLink(file.Name())
if fileName == spec.Name() {
return spec.IsDir() == file.IsDir(), nil
}
}
} else if spec.Pattern() != "" {
for _, file := range files {
_, fileName := checkLink(file.Name())
isMatch, err := regexp.MatchString(spec.Pattern(), fileName)
if err != nil {
return false, fmt.Errorf("invalid folder item spec pattern: %w", err)
}
if isMatch {
return spec.IsDir() == file.IsDir(), nil
}
}
}
return false, nil
}
func validateFile(spec spectypes.ItemSpec, fsys fs.FS, itemPath string) specerrors.ValidationErrors {
err := validateMaxSize(fsys, itemPath, spec)
if err != nil {
return specerrors.ValidationErrors{specerrors.NewStructuredError(err, specerrors.UnassignedCode)}
}
if mediaType := spec.ContentMediaType(); mediaType != nil {
err := validateContentType(fsys, itemPath, *mediaType)
if err != nil {
return specerrors.ValidationErrors{specerrors.NewStructuredError(err, specerrors.UnassignedCode)}
}
err = validateContentTypeSize(fsys, itemPath, *mediaType, spec)
if err != nil {
return specerrors.ValidationErrors{specerrors.NewStructuredError(err, specerrors.UnassignedCode)}
}
}
errs := spec.ValidateSchema(fsys, itemPath)
if len(errs) > 0 {
return errs
}
return nil
}