|
@@ -10,59 +10,34 @@
|
|
|
#include <jvalidate/status.h>
|
|
#include <jvalidate/status.h>
|
|
|
|
|
|
|
|
namespace jvalidate::constraint {
|
|
namespace jvalidate::constraint {
|
|
|
-class PolyConstraint : public Constraint {
|
|
|
|
|
-private:
|
|
|
|
|
- std::vector<std::unique_ptr<Constraint>> children_;
|
|
|
|
|
- bool match_all_;
|
|
|
|
|
- bool invert_{false};
|
|
|
|
|
-
|
|
|
|
|
|
|
+class AllOfConstraint : public SimpleConstraint<AllOfConstraint> {
|
|
|
public:
|
|
public:
|
|
|
- template <typename... Cs> static auto AllOf(Cs &&... cs) {
|
|
|
|
|
- return std::make_unique<PolyConstraint>(PolyConstraint(true, false, std::forward<Cs>(cs)...));
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- template <typename... Cs> static auto AnyOf(Cs &&... cs) {
|
|
|
|
|
- return std::make_unique<PolyConstraint>(PolyConstraint(false, false, std::forward<Cs>(cs)...));
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ std::vector<SubConstraint> children;
|
|
|
|
|
|
|
|
- static auto Not(std::unique_ptr<Constraint> child) {
|
|
|
|
|
- return std::make_unique<PolyConstraint>(PolyConstraint(false, true, std::move(child)));
|
|
|
|
|
- }
|
|
|
|
|
|
|
+public:
|
|
|
|
|
+ AllOfConstraint(std::vector<schema::Node const *> const & children)
|
|
|
|
|
+ : children(children.begin(), children.end()) {}
|
|
|
|
|
|
|
|
- Status accept(ConstraintVisitor const & visitor) const final {
|
|
|
|
|
- Status rval = Status::Noop;
|
|
|
|
|
- for (auto const & child : children_) {
|
|
|
|
|
- if (match_all_) {
|
|
|
|
|
- rval &= child->accept(visitor);
|
|
|
|
|
- } else {
|
|
|
|
|
- rval |= child->accept(visitor);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ AllOfConstraint(std::vector<std::unique_ptr<Constraint>> && children) {
|
|
|
|
|
+ for (auto && child : children) {
|
|
|
|
|
+ this->children.push_back(std::move(child));
|
|
|
}
|
|
}
|
|
|
- return invert_ ? !rval : rval;
|
|
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-private:
|
|
|
|
|
- template <typename... Cs>
|
|
|
|
|
- PolyConstraint(bool match_all, bool invert, Cs &&... cs)
|
|
|
|
|
- : match_all_(match_all), invert_(invert) {
|
|
|
|
|
- (children_.push_back(std::forward<Cs>(cs)), ...);
|
|
|
|
|
- }
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-class AllOfConstraint : public SimpleConstraint<AllOfConstraint> {
|
|
|
|
|
-public:
|
|
|
|
|
- std::vector<schema::Node const *> children;
|
|
|
|
|
-
|
|
|
|
|
-public:
|
|
|
|
|
- AllOfConstraint(std::vector<schema::Node const *> const & children) : children(children) {}
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
class AnyOfConstraint : public SimpleConstraint<AnyOfConstraint> {
|
|
class AnyOfConstraint : public SimpleConstraint<AnyOfConstraint> {
|
|
|
public:
|
|
public:
|
|
|
- std::vector<schema::Node const *> children;
|
|
|
|
|
|
|
+ std::vector<SubConstraint> children;
|
|
|
|
|
|
|
|
public:
|
|
public:
|
|
|
- AnyOfConstraint(std::vector<schema::Node const *> const & children) : children(children) {}
|
|
|
|
|
|
|
+ AnyOfConstraint(std::vector<schema::Node const *> const & children)
|
|
|
|
|
+ : children(children.begin(), children.end()) {}
|
|
|
|
|
+
|
|
|
|
|
+ AnyOfConstraint(std::vector<std::unique_ptr<Constraint>> && children) {
|
|
|
|
|
+ for (auto && child : children) {
|
|
|
|
|
+ this->children.push_back(std::move(child));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
class EnumConstraint : public SimpleConstraint<EnumConstraint> {
|
|
class EnumConstraint : public SimpleConstraint<EnumConstraint> {
|
|
@@ -101,10 +76,11 @@ public:
|
|
|
|
|
|
|
|
class NotConstraint : public SimpleConstraint<NotConstraint> {
|
|
class NotConstraint : public SimpleConstraint<NotConstraint> {
|
|
|
public:
|
|
public:
|
|
|
- schema::Node const * child;
|
|
|
|
|
|
|
+ SubConstraint child;
|
|
|
|
|
|
|
|
public:
|
|
public:
|
|
|
NotConstraint(schema::Node const * child) : child(child) {}
|
|
NotConstraint(schema::Node const * child) : child(child) {}
|
|
|
|
|
+ NotConstraint(std::unique_ptr<Constraint> && child) : child(std::move(child)) {}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
class TypeConstraint : public SimpleConstraint<TypeConstraint> {
|
|
class TypeConstraint : public SimpleConstraint<TypeConstraint> {
|