validator.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #pragma once
  2. #include <regex>
  3. #include <unordered_map>
  4. #include <jvalidate/forward.h>
  5. #include <jvalidate/status.h>
  6. #include <jvalidate/validation_visitor.h>
  7. namespace jvalidate::detail {
  8. class StdRegexEngine {
  9. public:
  10. std::regex regex_;
  11. public:
  12. StdRegexEngine(std::string const & regex) : regex_(regex) {}
  13. bool search(std::string const & text) const { return std::regex_search(text, regex_); }
  14. };
  15. }
  16. namespace jvalidate {
  17. template <template <Adapter, RegexEngine> class ValidationVisitor,
  18. RegexEngine RE = detail::StdRegexEngine>
  19. class ExtendedValidator {
  20. private:
  21. schema::Node const & schema_;
  22. std::unordered_map<std::string, RE> regex_cache_;
  23. public:
  24. ExtendedValidator(schema::Node const & schema) : schema_(schema) {}
  25. template <Adapter A>
  26. Status validate(A const & json, ValidationResult const * result = nullptr) const {
  27. return ValidationVisitor<A, RE>(json, schema_, regex_cache_, result).validate();
  28. }
  29. };
  30. class Validator : public ExtendedValidator<ValidationVisitor> {
  31. public:
  32. using Validator::ExtendedValidator::ExtendedValidator;
  33. };
  34. }