validator.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #pragma once
  2. #include <regex>
  3. #include <unordered_map>
  4. #include <jvalidate/forward.h>
  5. #include <jvalidate/status.h>
  6. #include <jvalidate/validation_config.h>
  7. #include <jvalidate/validation_visitor.h>
  8. namespace jvalidate::detail {
  9. class StdRegexEngine {
  10. public:
  11. std::regex regex_;
  12. public:
  13. StdRegexEngine(std::string const & regex) : regex_(detail::regex_escape(regex)) {}
  14. bool search(std::string const & text) const { return std::regex_search(text, regex_); }
  15. };
  16. }
  17. namespace jvalidate {
  18. template <RegexEngine RE = detail::StdRegexEngine> class ValidatorT {
  19. private:
  20. schema::Node const & schema_;
  21. ValidationConfig cfg_;
  22. std::unordered_map<std::string, RE> regex_cache_;
  23. public:
  24. ValidatorT(schema::Node const & schema, ValidationConfig const & cfg = {})
  25. : schema_(schema), cfg_(cfg) {}
  26. template <Adapter A>
  27. requires(not MutableAdapter<A>) bool validate(A const & json,
  28. ValidationResult * result = nullptr) {
  29. EXPECT_M(not cfg_.construct_default_values,
  30. "Cannot perform mutations on an immutable JSON Adapter");
  31. return static_cast<bool>(
  32. ValidationVisitor<A, RE>(json, schema_, cfg_, regex_cache_, result).validate());
  33. }
  34. template <MutableAdapter A> bool validate(A const & json, ValidationResult * result = nullptr) {
  35. return static_cast<bool>(
  36. ValidationVisitor<A, RE>(json, schema_, cfg_, regex_cache_, result).validate());
  37. }
  38. template <typename JSON>
  39. requires(not Adapter<JSON>) bool validate(JSON & json, ValidationResult * result = nullptr) {
  40. return validate(adapter::AdapterFor<JSON>(json), result);
  41. }
  42. };
  43. class Validator : public ValidatorT<> {
  44. public:
  45. using Validator::ValidatorT::ValidatorT;
  46. };
  47. }