validator.h 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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> Status validate(A const & json, Result const * result = nullptr) const {
  26. return ValidationVisitor<A, RE>(json, schema_, regex_cache_, result).validate();
  27. }
  28. };
  29. class Validator : public ExtendedValidator<ValidationVisitor> {
  30. public:
  31. using Validator::ExtendedValidator::ExtendedValidator;
  32. };
  33. }