浏览代码

feat: implement basic Unevaluated*

Sam Jaffe 1 年之前
父节点
当前提交
e87c73bf90

+ 3 - 3
include/jvalidate/constraint/array_constraint.h

@@ -62,11 +62,11 @@ public:
 };
 
 class UnevaluatedItemsConstraint : public SimpleConstraint<UnevaluatedItemsConstraint> {
-private:
-  schema::Node const * subschema_;
+public:
+  schema::Node const * subschema;
 
 public:
-  UnevaluatedItemsConstraint(schema::Node const * subschema) : subschema_(subschema) {}
+  UnevaluatedItemsConstraint(schema::Node const * subschema) : subschema(subschema) {}
 };
 
 class UniqueItemsConstraint : public SimpleConstraint<UniqueItemsConstraint> {

+ 3 - 3
include/jvalidate/constraint/object_constraint.h

@@ -97,10 +97,10 @@ public:
 };
 
 class UnevaluatedPropertiesConstraint : public SimpleConstraint<UnevaluatedPropertiesConstraint> {
-private:
-  schema::Node const * subschema_;
+public:
+  schema::Node const * subschema;
 
 public:
-  UnevaluatedPropertiesConstraint(schema::Node const * subschema) : subschema_(subschema) {}
+  UnevaluatedPropertiesConstraint(schema::Node const * subschema) : subschema(subschema) {}
 };
 }

+ 5 - 1
include/jvalidate/result.h

@@ -3,5 +3,9 @@
 #include <jvalidate/forward.h>
 
 namespace jvalidate {
-class Result {};
+class Result {
+public:
+  std::unordered_set<std::string> visited_properties;
+  std::unordered_set<size_t> visited_items;
+};
 }

+ 30 - 2
include/jvalidate/validation_visitor.h

@@ -353,8 +353,36 @@ public:
     return required.empty();
   }
 
-  Status visit(constraint::UnevaluatedItemsConstraint const & cons) const { throw; }
-  Status visit(constraint::UnevaluatedPropertiesConstraint const & cons) const { throw; }
+  Status visit(constraint::UnevaluatedItemsConstraint const & cons) const {
+    NOOP_UNLESS_TYPE(Array);
+
+    Status rval = Status::Accept;
+    auto array = document_.as_array();
+    for (size_t i = 0; i < array.size(); ++i) {
+      if (not result_->visited_items.contains(i)) {
+        rval &= validate_subschema_for(cons.subschema, array[i]);
+      }
+      // TODO(samjaffe): Special Rule
+      if (!rval && result_ == nullptr) {
+        break;
+      }
+    }
+  }
+
+  Status visit(constraint::UnevaluatedPropertiesConstraint const & cons) const {
+    NOOP_UNLESS_TYPE(Object);
+
+    Status rval = Status::Accept;
+    for (auto const & [key, elem] : document_.as_object()) {
+      if (not result_->visited_properties.contains(key)) {
+        rval &= validate_subschema_for(cons.subschema, elem);
+      }
+      // TODO(samjaffe): Special Rule
+      if (!rval && result_ == nullptr) {
+        break;
+      }
+    }
+  }
 
   Status validate() const {
     if (schema_.rejects_all()) {