Преглед изворни кода

refactor: add printing, make mainprog depend on headers

Sam Jaffe пре 3 недеља
родитељ
комит
1927414aba
3 измењених фајлова са 64 додато и 2 уклоњено
  1. 1 1
      Makefile
  2. 62 0
      include/jvalidate/adapter.h
  3. 1 1
      include/jvalidate/validation_visitor.h

+ 1 - 1
Makefile

@@ -50,7 +50,7 @@ run-test: $(EXECUTE_TESTS)
 	$(CXX) $(CXX_FLAGS) -c $< -o $@ -Wno-character-conversion
 
 
-.build/bin/validate: src/validate.cxx
+.build/bin/validate: src/validate.cxx $(HEADERS)
 	@ mkdir -p .build/bin
 	$(CXX) $< -o $@ $(CXX_FLAGS) $(LD_FLAGS) -ljsoncpp -lcurl
 

+ 62 - 0
include/jvalidate/adapter.h

@@ -2,6 +2,7 @@
 
 #include <cstdint>
 #include <optional>
+#include <ostream>
 
 #include <jvalidate/detail/array_iterator.h>
 #include <jvalidate/detail/number.h>
@@ -313,6 +314,48 @@ public:
       return std::nullopt;
     }
   }
+
+  virtual void write(std::ostream & os) const {
+    std::string_view div;
+    switch (type()) {
+    case Type::Null:
+      os << "null";
+      break;
+    case Type::Boolean:
+      os << (as_boolean() ? "true" : "false");
+      break;
+    case Type::Integer:
+      os << as_integer();
+      break;
+    case Type::Number:
+      os << as_number();
+      break;
+    case Type::String:
+      os << '"' << as_string() << '"';
+      break;
+    case Type::Array:
+      os << '[';
+      apply_array([&os, &div](Adapter const & elem) {
+        os << std::exchange(div, ", ") << elem;
+        return Status::Accept;
+      });
+      os << ']';
+      break;
+    case Type::Object:
+      os << '{';
+      apply_object([&os, &div](std::string const & key, Adapter const & elem) {
+        os << std::exchange(div, ", ") << '"' << key << '"' << ':' << elem;
+        return Status::Accept;
+      });
+      os << '}';
+      break;
+    }
+  }
+
+  friend std::ostream & operator<<(std::ostream & os, Adapter const & self) {
+    self.write(os);
+    return os;
+  }
 };
 
 /**
@@ -331,6 +374,13 @@ public:
    * @return the result of cb on the contained JSON
    */
   virtual Status apply(AdapterCallback const & cb) const = 0;
+  friend std::ostream & operator<<(std::ostream & os, Const const & self) {
+    self.apply([&os](Adapter const & adapter) {
+      adapter.write(os);
+      return Status::Accept;
+    });
+    return os;
+  }
 };
 }
 
@@ -355,3 +405,15 @@ private:
   JSON value_;
 };
 }
+
+namespace std {
+inline ostream & operator<<(ostream & os,
+                            vector<unique_ptr<jvalidate::adapter::Const const>> const & items) {
+  std::string_view div;
+  os << '[';
+  for (auto const & ptr : items) {
+    os << std::exchange(div, ", ") << *ptr;
+  }
+  return os << ']';
+}
+}

+ 1 - 1
include/jvalidate/validation_visitor.h

@@ -117,7 +117,7 @@ public:
         return result(Status::Accept, index);
       }
     }
-    return Status::Reject;
+    return result(Status::Reject, document, " value is not one of ", cons.enumeration);
   }
 
   Status visit(constraint::AllOfConstraint const & cons, Adapter auto const & document) const {