json_binder_visitor.hpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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>
  8. class visitor {
  9. public:
  10. visitor(S& o, binder_impl<T>& b) : obj(o), b(b) {}
  11. void parse(char const* data, parser::options opts) {
  12. b.parse(obj, data, opts);
  13. if ( json::helper::get_next_element(data)
  14. && opts & parser::disable_concatenated_json_bodies ) {
  15. throw malformed_json_exception{
  16. "Config set to require json input be terminated"
  17. };
  18. }
  19. }
  20. void write(std::ostream & data) const {
  21. b.write(obj, data);
  22. }
  23. private:
  24. S& obj;
  25. binder_impl<T>& b;
  26. };
  27. template <typename T, typename S>
  28. visitor<T, S> bind(S& object, binder_impl<T>& b) {
  29. return {object, b};
  30. }
  31. } }
  32. namespace json { namespace parser {
  33. template <typename T>
  34. void parse(binder::visitor<T>& visitor, char const* data,
  35. options opts = allow_all) {
  36. visitor.parse(data, opts);
  37. }
  38. template <typename T, typename S>
  39. void write(binder::visitor<T, S> const & visitor, std::ostream & out) {
  40. visitor.write(out);
  41. }
  42. template <typename T, typename S>
  43. void write(binder::visitor<T, S> const & visitor, std::string & data) {
  44. std::stringstream ss;
  45. visitor.write(ss);
  46. data = ss.str();
  47. }
  48. } }