validator.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. };
  37. class Validator : public ValidatorT<> {
  38. public:
  39. using Validator::ValidatorT::ValidatorT;
  40. };
  41. }