validate.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package preview
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/porter-dev/switchboard/pkg/parser"
  6. "github.com/porter-dev/switchboard/pkg/types"
  7. )
  8. var (
  9. ErrNoPorterYAMLFile = errors.New("porter.yaml does not exist in the root of this repository")
  10. ErrEmptyPorterYAMLFile = errors.New("porter.yaml is empty")
  11. ErrUnsupportedDriver = errors.New("no such driver")
  12. )
  13. type driverBasedResourceValidator func(*types.Resource) error
  14. type porterYAMLValidator struct {
  15. driverValidators map[string]driverBasedResourceValidator
  16. }
  17. func NewPorterYAMLValidator() *porterYAMLValidator {
  18. driverValidators := make(map[string]driverBasedResourceValidator)
  19. driverValidators["push-image"] = pushImageDriverValidator
  20. return &porterYAMLValidator{
  21. driverValidators: driverValidators,
  22. }
  23. }
  24. func (v *porterYAMLValidator) Validate(contents string) []error {
  25. var errors []error
  26. resGroup, err := parser.ParseRawBytes([]byte(contents))
  27. if err != nil {
  28. errors = append(errors, fmt.Errorf("error parsing porter.yaml: %w", err))
  29. return errors
  30. }
  31. for _, res := range resGroup.Resources {
  32. if validator, ok := v.driverValidators[res.Driver]; ok {
  33. if err := validator(res); err != nil {
  34. errors = append(errors, err)
  35. }
  36. } else {
  37. errors = append(errors, fmt.Errorf("%w: %s", ErrUnsupportedDriver, res.Driver))
  38. }
  39. }
  40. return errors
  41. }