libdballe  7.21
json.h
1 #ifndef DBALLE_CORE_JSON_H
2 #define DBALLE_CORE_JSON_H
3 
4 #include <wreport/varinfo.h>
5 #include <wreport/var.h>
6 #include <dballe/core/defs.h>
7 #include <vector>
8 #include <ostream>
9 #include <istream>
10 
11 namespace dballe {
12 namespace core {
13 
24 {
25 protected:
26  enum State {
27  LIST_FIRST,
28  LIST,
29  MAPPING_KEY_FIRST,
30  MAPPING_KEY,
31  MAPPING_VAL,
32  };
33  std::ostream& out;
34  std::vector<State> stack;
35 
37  void val_head();
38 
39  void jputc(char c);
40  void jputs(const char* s);
41 
42 public:
43  JSONWriter(std::ostream& out);
44  ~JSONWriter();
45 
50  void reset();
51 
52  void start_list();
53  void end_list();
54 
55  void start_mapping();
56  void end_mapping();
57 
58  void add_null();
59  void add_bool(bool val);
60  void add_int(int val);
61  void add_double(double val);
62  void add_cstring(const char* val);
63  void add_string(const std::string& val);
64 
65  void add_number(const std::string& val);
66  void add_level(const Level& val);
67  void add_trange(const Trange& val);
68  void add_datetime(const Datetime& val);
69  void add_coords(const Coords& val);
70  void add_var(const wreport::Var& val);
71  void add_break();
72 
73  void add(const std::string& val) { add_string(val); }
74  void add(const char* val) { add_cstring(val); }
75  void add(double val) { add_double(val); }
76  void add(int val) { add_int(val); }
77  void add(bool val) { add_bool(val); }
78  void add(wreport::Varcode val) { add_int(val); }
79  void add(const Level& val) { add_level(val); }
80  void add(const Trange& val) { add_trange(val); }
81  void add(const Datetime& val) { add_datetime(val); }
82  void add(const Coords& val) { add_coords(val); }
83  void add(const wreport::Var& val) { add_var(val); }
84 
85  template<typename T>
86  void add(const char* a, T b)
87  {
88  add_cstring(a);
89  add(b);
90  }
91 
92  template<typename T>
93  void add_list(const T& val)
94  {
95  start_list();
96  for (const auto& i : val)
97  add(i);
98  end_list();
99  }
100 };
101 
105 class JSONReader {
106 public:
107  virtual void on_start_list() = 0;
108  virtual void on_end_list() = 0;
109 
110  virtual void on_start_mapping() = 0;
111  virtual void on_end_mapping() = 0;
112 
113  virtual void on_add_null() = 0;
114  virtual void on_add_bool(bool val) = 0;
115  virtual void on_add_int(int val) = 0;
116  virtual void on_add_double(double val) = 0;
117  virtual void on_add_string(const std::string& val) = 0;
118 
119  // Parse a stream
120  void parse(std::istream& in);
121 };
122 
123 }
124 }
125 #endif
Coordinates.
Definition: types.h:337
Information on how a value has been sampled or computed with regards to time.
Definition: types.h:587
Copyright (C) 2008–2010 ARPA-SIM urpsim@smr.arpa.emr.it
Definition: cmdline.h:17
Vertical level or layer.
Definition: types.h:532
uint16_t Varcode
JSON sax-like parser.
Definition: json.h:105
void val_head()
Append whatever separator is needed (if any) before a new value.
Date and time.
Definition: types.h:158
JSON serializer.
Definition: json.h:23
Common definitions.
void reset()
Reset the serializer state, to cancel the current output and prepare for a new one.