validator.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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_(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>) Status
  28. validate(A const & json, ValidationResult * result = nullptr) {
  29. EXPECT_M(not cfg_.construct_default_values,
  30. "Cannot perform mutations on an immutable JSON Adapter");
  31. return ValidationVisitor<A, RE>(json, schema_, cfg_, regex_cache_, result).validate();
  32. }
  33. template <MutableAdapter A> Status validate(A const & json, ValidationResult * result = nullptr) {
  34. return ValidationVisitor<A, RE>(json, schema_, cfg_, regex_cache_, result).validate();
  35. }
  36. template <typename JSON>
  37. requires(not Adapter<JSON>) Status validate(JSON & json, ValidationResult * result = nullptr) {
  38. return validate(adapter::AdapterFor<JSON>(json), result);
  39. }
  40. };
  41. class Validator : public ValidatorT<> {
  42. public:
  43. using Validator::ValidatorT::ValidatorT;
  44. };
  45. }