general_constraint.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #pragma once
  2. #include <memory>
  3. #include <set>
  4. #include <utility>
  5. #include <vector>
  6. #include <jvalidate/constraint/constraint.h>
  7. #include <jvalidate/forward.h>
  8. #include <jvalidate/status.h>
  9. namespace jvalidate::constraint {
  10. class PolyConstraint : public Constraint {
  11. private:
  12. std::vector<std::unique_ptr<Constraint>> children_;
  13. bool match_all_;
  14. bool invert_{false};
  15. public:
  16. template <typename... Cs> static auto AllOf(Cs &&... cs) {
  17. return std::make_unique<PolyConstraint>(PolyConstraint(true, false, std::forward<Cs>(cs)...));
  18. }
  19. template <typename... Cs> static auto AnyOf(Cs &&... cs) {
  20. return std::make_unique<PolyConstraint>(PolyConstraint(false, false, std::forward<Cs>(cs)...));
  21. }
  22. static auto Not(std::unique_ptr<Constraint> child) {
  23. return std::make_unique<PolyConstraint>(PolyConstraint(false, true, std::move(child)));
  24. }
  25. Status accept(ConstraintVisitor const & visitor) const final {
  26. Status rval = Status::Noop;
  27. for (auto const & child : children_) {
  28. if (match_all_) {
  29. rval &= child->accept(visitor);
  30. } else {
  31. rval |= child->accept(visitor);
  32. }
  33. }
  34. return invert_ ? !rval : rval;
  35. }
  36. private:
  37. template <typename... Cs>
  38. PolyConstraint(bool match_all, bool invert, Cs &&... cs)
  39. : match_all_(match_all), invert_(invert) {
  40. (children_.push_back(std::forward<Cs>(cs)), ...);
  41. }
  42. };
  43. class AllOfConstraint : public SimpleConstraint<AllOfConstraint> {
  44. public:
  45. std::vector<schema::Node const *> children;
  46. public:
  47. AllOfConstraint(std::vector<schema::Node const *> const & children) : children(children) {}
  48. };
  49. class AnyOfConstraint : public SimpleConstraint<AnyOfConstraint> {
  50. public:
  51. std::vector<schema::Node const *> children;
  52. public:
  53. AnyOfConstraint(std::vector<schema::Node const *> const & children) : children(children) {}
  54. };
  55. class EnumConstraint : public SimpleConstraint<EnumConstraint> {
  56. public:
  57. std::vector<std::unique_ptr<adapter::Const const>> enumeration;
  58. public:
  59. EnumConstraint(std::unique_ptr<adapter::Const const> && constant) {
  60. enumeration.push_back(std::move(constant));
  61. }
  62. EnumConstraint(std::vector<std::unique_ptr<adapter::Const const>> && enums)
  63. : enumeration(std::move(enums)) {}
  64. };
  65. class OneOfConstraint : public SimpleConstraint<OneOfConstraint> {
  66. public:
  67. std::vector<schema::Node const *> children;
  68. public:
  69. OneOfConstraint(std::vector<schema::Node const *> const & children) : children(children) {}
  70. };
  71. class ConditionalConstraint : public SimpleConstraint<ConditionalConstraint> {
  72. public:
  73. schema::Node const * if_constraint;
  74. schema::Node const * then_constraint;
  75. schema::Node const * else_constraint;
  76. public:
  77. ConditionalConstraint(schema::Node const * if_constraint, schema::Node const * then_constraint,
  78. schema::Node const * else_constraint)
  79. : if_constraint(if_constraint), then_constraint(then_constraint),
  80. else_constraint(else_constraint) {}
  81. };
  82. class NotConstraint : public SimpleConstraint<NotConstraint> {
  83. public:
  84. schema::Node const * child;
  85. public:
  86. NotConstraint(schema::Node const * child) : child(child) {}
  87. };
  88. class TypeConstraint : public SimpleConstraint<TypeConstraint> {
  89. public:
  90. std::set<adapter::Type> types;
  91. public:
  92. TypeConstraint(adapter::Type type) : types{type} {}
  93. TypeConstraint(std::set<adapter::Type> const & types) : types(types) {}
  94. };
  95. }