json_binder_visitor.hpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #pragma once
  2. #include "json_binder.hpp"
  3. #include "json/json_common.hpp"
  4. #include <iosfwd>
  5. #include <sstream>
  6. namespace json { namespace binder {
  7. template <typename T, typename S = T> class visitor {
  8. public:
  9. visitor(S & o, binder_impl<T> & b) : obj(o), b(b) {}
  10. void parse(char const * data, parser::options opts) {
  11. b.parse(obj, data, opts);
  12. if (json::helper::get_next_element(data) &&
  13. opts & parser::disable_concatenated_json_bodies) {
  14. throw malformed_json_exception{
  15. "Config set to require json input be terminated"};
  16. }
  17. }
  18. void write(std::ostream & data) const { b.write(obj, data); }
  19. private:
  20. S & obj;
  21. binder_impl<T> & b;
  22. };
  23. template <typename T, typename S>
  24. visitor<T, S> bind(S & object, binder_impl<T> & b) {
  25. return {object, b};
  26. }
  27. }}
  28. namespace json { namespace parser {
  29. template <typename T>
  30. void parse(binder::visitor<T> & visitor, char const * data,
  31. options opts = allow_all) {
  32. visitor.parse(data, opts);
  33. }
  34. template <typename T, typename S>
  35. void write(binder::visitor<T, S> const & visitor, std::ostream & out) {
  36. visitor.write(out);
  37. }
  38. template <typename T, typename S>
  39. void write(binder::visitor<T, S> const & visitor, std::string & data) {
  40. std::stringstream ss;
  41. visitor.write(ss);
  42. data = ss.str();
  43. }
  44. }}