#pragma once #include #include #include #include #include #include namespace jvalidate::constraint { class Constraint { public: using SubConstraint = std::variant>; public: virtual ~Constraint() = default; virtual Status accept(ConstraintVisitor const & visitor) const = 0; }; template class SimpleConstraint : public Constraint { public: Status accept(ConstraintVisitor const & visitor) const final { return visitor.visit(*static_cast(this)); } }; class ExtensionConstraint : public Constraint { public: Status accept(ConstraintVisitor const & visitor) const final { return visitor.visit(*this); } virtual Status validate(adapter::Adapter const & json, detail::Pointer const & where, ValidationResult * result) const = 0; }; }