forward.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. class ExtensionConstraint;
  24. class TypeConstraint;
  25. class EnumConstraint;
  26. class AllOfConstraint;
  27. class AnyOfConstraint;
  28. class OneOfConstraint;
  29. class NotConstraint;
  30. class ConditionalConstraint;
  31. class MaximumConstraint;
  32. class MinimumConstraint;
  33. class MultipleOfConstraint;
  34. class MaxLengthConstraint;
  35. class MinLengthConstraint;
  36. class PatternConstraint;
  37. class AdditionalItemsConstraint;
  38. class ContainsConstraint;
  39. class MaxItemsConstraint;
  40. class MinItemsConstraint;
  41. class TupleConstraint;
  42. class UnevaluatedItemsConstraint;
  43. class UniqueItemsConstraint;
  44. class AdditionalPropertiesConstraint;
  45. class DependenciesConstraint;
  46. class MaxPropertiesConstraint;
  47. class MinPropertiesConstraint;
  48. class PatternPropertiesConstraint;
  49. class PropertiesConstraint;
  50. class PropertyNamesConstraint;
  51. class RequiredConstraint;
  52. class UnevaluatedPropertiesConstraint;
  53. }
  54. namespace jvalidate::schema {
  55. enum class Version : int;
  56. class Node;
  57. }
  58. namespace jvalidate {
  59. template <typename It>
  60. concept ArrayIterator = std::forward_iterator<It> and std::is_default_constructible_v<It> and
  61. requires(It const it) {
  62. { *it } -> std::convertible_to<adapter::Adapter const &>;
  63. };
  64. template <typename It>
  65. concept ObjectIterator = std::forward_iterator<It> and std::is_default_constructible_v<It> and
  66. requires(It const it) {
  67. { it->first } -> std::convertible_to<std::string_view>;
  68. { it->second } -> std::convertible_to<adapter::Adapter const &>;
  69. };
  70. template <typename A>
  71. concept ArrayAdapter = requires(A const a) {
  72. { a.size() } -> std::convertible_to<std::size_t>;
  73. { a[0UL] } -> std::convertible_to<adapter::Adapter const &>;
  74. { a.begin() } -> ArrayIterator;
  75. { a.end() } -> ArrayIterator;
  76. };
  77. template <typename A>
  78. concept ObjectAdapter = requires(A const a) {
  79. { a.size() } -> std::convertible_to<std::size_t>;
  80. { a.contains("") } -> std::same_as<bool>;
  81. { a[""] } -> std::convertible_to<adapter::Adapter const &>;
  82. { a.begin() } -> ObjectIterator;
  83. { a.end() } -> ObjectIterator;
  84. };
  85. template <typename A>
  86. concept Adapter = std::is_base_of_v<adapter::Adapter, A> && requires(A a) {
  87. { a.type() } -> std::same_as<adapter::Type>;
  88. { a.as_boolean() } -> std::same_as<bool>;
  89. { a.as_integer() } -> std::convertible_to<int64_t>;
  90. { a.as_number() } -> std::convertible_to<double>;
  91. { a.as_number() } -> std::floating_point;
  92. { a.as_object() } -> ObjectAdapter;
  93. { a.as_array() } -> ArrayAdapter;
  94. { a.array_size() } -> std::convertible_to<size_t>;
  95. { a.object_size() } -> std::convertible_to<size_t>;
  96. };
  97. template <typename R>
  98. concept RegexEngine = std::constructible_from<std::string> && requires(R const regex) {
  99. { regex.search("") } -> std::same_as<bool>;
  100. };
  101. }
  102. namespace jvalidate {
  103. template <Adapter A, RegexEngine RE> class ValidationVisitor;
  104. class Validator;
  105. }