1
1

streamConsumer.hh 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /**
  2. * streamConsumer.hh for jsonstroller
  3. *
  4. * Author: isundil <isundill@gmail.com>
  5. **/
  6. #pragma once
  7. #include <istream>
  8. #include "params.hh"
  9. #include "jsonObject.hh"
  10. #include "jsonArray.hh"
  11. #include "jsonPrimitive.hh"
  12. #include "linearHistory.hh"
  13. #include "warning.hh"
  14. class StreamConsumer
  15. {
  16. public:
  17. /**
  18. * constructor
  19. * does not read yet
  20. **/
  21. StreamConsumer(std::istream &stream);
  22. virtual ~StreamConsumer();
  23. /**
  24. * read from stream and set root data
  25. * @return current instance
  26. **/
  27. StreamConsumer *read();
  28. /**
  29. * get root node
  30. **/
  31. const JSonElement * getRoot() const;
  32. JSonElement * getRoot();
  33. /**
  34. * return non-blocking error messages
  35. **/
  36. const std::list<Warning> &getMessages() const;
  37. /**
  38. * set builder's params
  39. **/
  40. StreamConsumer *withConfig(const AParams *);
  41. /**
  42. * find \uXXXX in buffer and replace them
  43. **/
  44. static std::string extractUnicode(const char *);
  45. static std::string extractUnicode(const std::string &);
  46. protected:
  47. /**
  48. * @return non-null on successfully read JSonElement, or null if token (',', '[', ...)
  49. **/
  50. JSonElement *consumeToken(JSonContainer *parent, std::stringstream &buf);
  51. JSonElement *consumeString(JSonContainer *parent, std::stringstream &buf);
  52. JSonElement *consumeBool(JSonContainer *parent, std::stringstream &buf, char c);
  53. JSonElement *consumeNumber(JSonContainer *parent, std::stringstream &buf, char c);
  54. JSonElement *consumeNull(JSonContainer *parent, std::stringstream &buf, char firstChar);
  55. bool consumeEscapedChar(char c, std::stringstream &buf);
  56. /**
  57. * read next item, fill object or array if found
  58. **/
  59. JSonElement *readNext(JSonContainer *parent);
  60. /**
  61. * fill object
  62. **/
  63. JSonObject *readObject(JSonContainer *parent);
  64. /**
  65. * fill array
  66. **/
  67. JSonArray *readArray(JSonContainer *parent);
  68. /**
  69. * out of token, should we ignore that char ?
  70. **/
  71. bool ignoreChar(char c) const noexcept;
  72. /**
  73. * compute unicode value and append it to buffer
  74. **/
  75. static void appendUnicode(const char [4], std::stringstream &);
  76. /**
  77. * input stream
  78. **/
  79. std::istream &stream;
  80. /**
  81. * once read, contains root element
  82. **/
  83. JSonElement *root;
  84. /**
  85. * builder params (program's one in fact)
  86. **/
  87. const AParams *params;
  88. /**
  89. * non-blocking errors
  90. **/
  91. std::list<Warning> warnings;
  92. /**
  93. * last read input
  94. **/
  95. LinearHistory history;
  96. };