content_rewrite_validation.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package rewrite // import "miniflux.app/v2/internal/reader/rewrite"
  4. import (
  5. "regexp"
  6. "text/scanner"
  7. )
  8. type RuleErrorKind int
  9. const (
  10. RuleErrLexical RuleErrorKind = iota
  11. RuleErrUnquote
  12. RuleErrOrphanArg
  13. RuleErrUnknownName
  14. RuleErrMissingArgs
  15. RuleErrInvalidRegexp
  16. )
  17. // RuleError describes one problem found while parsing rewrite rules.
  18. type RuleError struct {
  19. Pos scanner.Position
  20. Kind RuleErrorKind
  21. Rule string
  22. Token string
  23. Message string
  24. }
  25. // validateParsedRules checks parsed rules against knownRules for unknown names
  26. // and missing arguments.
  27. func validateParsedRules(rules []rule) (errs []RuleError) {
  28. for _, r := range rules {
  29. spec, ok := knownRules[r.name]
  30. if !ok {
  31. errs = append(errs, RuleError{Kind: RuleErrUnknownName, Rule: r.name,
  32. Message: "unknown rewrite rule name"})
  33. continue
  34. }
  35. if len(r.args) < spec.minArgs {
  36. errs = append(errs, RuleError{Kind: RuleErrMissingArgs, Rule: r.name,
  37. Message: "missing required arguments"})
  38. continue
  39. }
  40. if spec.regexArg && len(r.args) > 0 {
  41. if _, err := regexp.Compile(r.args[0]); err != nil {
  42. errs = append(errs, RuleError{Kind: RuleErrInvalidRegexp, Rule: r.name,
  43. Token: r.args[0], Message: err.Error()})
  44. }
  45. }
  46. }
  47. return errs
  48. }
  49. // ValidateRules parses rules solely to report problems. It returns nil when the
  50. // rules are well-formed.
  51. func ValidateRules(rulesText string) []RuleError {
  52. _, errs := parseRules(rulesText)
  53. return errs
  54. }