forward.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #pragma once
  2. #include <functional>
  3. #include <string>
  4. namespace jvalidate {
  5. class Result;
  6. class Schema;
  7. class Status;
  8. }
  9. namespace jvalidate::adapter {
  10. enum class Type : int8_t;
  11. class Adapter;
  12. class Const;
  13. using AdapterCallback = std::function<Status(adapter::Adapter const &)>;
  14. using ObjectAdapterCallback = std::function<Status(std::string const &, adapter::Adapter const &)>;
  15. template <typename> struct AdapterTraits;
  16. template <typename V> struct AdapterTraits<V const> : AdapterTraits<V> {};
  17. template <typename JSON> using AdapterFor = typename AdapterTraits<JSON>::template Adapter<JSON>;
  18. }
  19. namespace jvalidate::constraint {
  20. class ConstraintVisitor;
  21. class Constraint;
  22. template <typename> class SimpleConstraint;
  23. template <typename> class ExtensionConstraint;
  24. template <typename T>
  25. concept Extension = std::is_base_of_v<ExtensionConstraint<T>, T>;
  26. class AdditionalItemsConstraint;
  27. class AdditionalPropertiesConstraint;
  28. class AllOfConstraint;
  29. class AnyOfConstraint;
  30. class ConditionalConstraint;
  31. class ContainsConstraint;
  32. class DependenciesConstraint;
  33. class EnumConstraint;
  34. class MaxItemsConstraint;
  35. class MaxLengthConstraint;
  36. class MaxPropertiesConstraint;
  37. class MaximumConstraint;
  38. class MinItemsConstraint;
  39. class MinLengthConstraint;
  40. class MinPropertiesConstraint;
  41. class MinimumConstraint;
  42. class MultipleOfConstraint;
  43. class NotConstraint;
  44. class OneOfConstraint;
  45. class PatternConstraint;
  46. class PatternPropertiesConstraint;
  47. class PropertiesConstraint;
  48. class PropertyNamesConstraint;
  49. class RequiredConstraint;
  50. class TupleConstraint;
  51. class TypeConstraint;
  52. class UnevaluatedItemsConstraint;
  53. class UnevaluatedPropertiesConstraint;
  54. class UniqueItemsConstraint;
  55. }
  56. namespace jvalidate::schema {
  57. enum class Version : int;
  58. class Node;
  59. }
  60. namespace jvalidate {
  61. template <typename It>
  62. concept ArrayIterator = std::forward_iterator<It> and std::is_default_constructible_v<It> and
  63. requires(It const it) {
  64. { *it } -> std::convertible_to<adapter::Adapter const &>;
  65. };
  66. template <typename It>
  67. concept ObjectIterator = std::forward_iterator<It> and std::is_default_constructible_v<It> and
  68. requires(It const it) {
  69. { it->first } -> std::convertible_to<std::string_view>;
  70. { it->second } -> std::convertible_to<adapter::Adapter const &>;
  71. };
  72. template <typename A>
  73. concept ArrayAdapter = requires(A const a) {
  74. { a.size() } -> std::convertible_to<std::size_t>;
  75. { a[0UL] } -> std::convertible_to<adapter::Adapter const &>;
  76. { a.begin() } -> ArrayIterator;
  77. { a.end() } -> ArrayIterator;
  78. };
  79. template <typename A>
  80. concept ObjectAdapter = requires(A const a) {
  81. { a.size() } -> std::convertible_to<std::size_t>;
  82. { a.contains("") } -> std::same_as<bool>;
  83. { a[""] } -> std::convertible_to<adapter::Adapter const &>;
  84. { a.begin() } -> ObjectIterator;
  85. { a.end() } -> ObjectIterator;
  86. };
  87. template <typename A>
  88. concept Adapter = std::is_base_of_v<adapter::Adapter, A> && requires(A a) {
  89. { a.type() } -> std::same_as<adapter::Type>;
  90. { a.as_boolean() } -> std::same_as<bool>;
  91. { a.as_integer() } -> std::convertible_to<int64_t>;
  92. { a.as_number() } -> std::convertible_to<double>;
  93. { a.as_number() } -> std::floating_point;
  94. { a.as_object() } -> ObjectAdapter;
  95. { a.as_array() } -> ArrayAdapter;
  96. { a.array_size() } -> std::convertible_to<size_t>;
  97. { a.object_size() } -> std::convertible_to<size_t>;
  98. };
  99. template <typename R>
  100. concept RegexEngine = std::constructible_from<std::string> && requires(R const regex) {
  101. { regex.search("") } -> std::same_as<bool>;
  102. };
  103. }
  104. namespace jvalidate {
  105. template <Adapter A, RegexEngine RE, typename CRTP, constraint::Extension... Extensions>
  106. class ValidationVisitorBase;
  107. template <Adapter A, RegexEngine RE> class ValidationVisitor;
  108. class Validator;
  109. }