libdballe  9.11
wr_codec.h
1 #ifndef DBALLE_MSG_WR_CODEC_H
2 #define DBALLE_MSG_WR_CODEC_H
3 
4 #include <dballe/importer.h>
5 #include <dballe/exporter.h>
6 #include <dballe/core/fwd.h>
7 #include <dballe/msg/msg.h>
8 #include <wreport/varinfo.h>
9 #include <stdint.h>
10 #include <map>
11 #include <string>
12 #include <functional>
13 
14 namespace wreport {
15 struct Bulletin;
16 struct Subset;
17 }
18 
19 namespace dballe {
20 namespace impl {
21 namespace msg {
22 
24 {
25 public:
27 
31  std::vector<std::shared_ptr<dballe::Message>> from_bulletin(const wreport::Bulletin& msg) const override;
32 
45  bool foreach_decoded_bulletin(const wreport::Bulletin& msg, std::function<bool(std::shared_ptr<dballe::Message>)> dest) const;
46 };
47 
48 class BufrImporter : public WRImporter
49 {
50 public:
52  virtual ~BufrImporter();
53 
54  Encoding encoding() const override { return Encoding::BUFR; }
55 
56  bool foreach_decoded(const BinaryMessage& msg, std::function<bool(std::shared_ptr<dballe::Message>)> dest) const override;
57 };
58 
59 class CrexImporter : public WRImporter
60 {
61 public:
63  virtual ~CrexImporter();
64 
65  Encoding encoding() const override { return Encoding::CREX; }
66 
67  bool foreach_decoded(const BinaryMessage& msg, std::function<bool(std::shared_ptr<dballe::Message>)> dest) const override;
68 };
69 
70 namespace wr {
71 class Template;
72 }
73 
75 {
76 public:
78 
82  std::unique_ptr<wreport::Bulletin> to_bulletin(const std::vector<std::shared_ptr<dballe::Message>>& msgs) const override;
83 
87  std::unique_ptr<wr::Template> infer_template(const Messages& msgs) const;
88 };
89 
90 class BufrExporter : public WRExporter
91 {
92 public:
93  BufrExporter(const dballe::ExporterOptions& opts=dballe::ExporterOptions::defaults);
94  virtual ~BufrExporter();
95 
96  std::string to_binary(const Messages& msgs) const override;
97  std::unique_ptr<wreport::Bulletin> make_bulletin() const override;
98 };
99 
100 class CrexExporter : public WRExporter
101 {
102 public:
103  CrexExporter(const dballe::ExporterOptions& opts=dballe::ExporterOptions::defaults);
104  virtual ~CrexExporter();
105 
106  std::string to_binary(const Messages& msgs) const override;
107  std::unique_ptr<wreport::Bulletin> make_bulletin() const override;
108 };
109 
110 namespace wr {
111 
112 struct TemplateRegistry;
113 
114 class Template
115 {
116 protected:
117  virtual void setupBulletin(wreport::Bulletin& bulletin);
118  virtual void to_subset(const Message& msg, wreport::Subset& subset);
119 
120  void add(wreport::Varcode code, const msg::Context* ctx, const Shortcut& shortcut) const;
121  void add(wreport::Varcode code, const msg::Context* ctx, wreport::Varcode srccode) const;
122  void add(wreport::Varcode code, const msg::Context* ctx) const;
123  void add(wreport::Varcode code, const Values& values) const;
124  void add(wreport::Varcode code, const Values& values, const Shortcut& shortcut) const;
125  void add(wreport::Varcode code, const Shortcut& shortcut) const;
126  void add(wreport::Varcode code, wreport::Varcode srccode, const Level& level, const Trange& trange) const;
127  void add(wreport::Varcode code, const wreport::Var* var) const;
128  // Set station name, truncating it if it's too long
129  void do_station_name(wreport::Varcode dstcode) const;
130 
133 
134  void do_ecmwf_past_wtr() const;
135  void do_station_height() const;
136  // WMO block and station numbers
137  void do_D01001() const;
138  void do_D01004() const;
139  // Date (year, month, day)
140  void do_D01011() const;
141  // Time (hour and minute), return the hour
142  int do_D01012() const;
143  // Time (hour, minute, second)
144  void do_D01013() const;
145  // Latitude and longitude, high accuracy
146  void do_D01021() const;
147  void do_D01022() const;
148  // Latitude and longitude, coarse accuracy
149  void do_D01023() const;
150 
151 public:
152  const dballe::ExporterOptions& opts;
153  const Messages& msgs;
154  const Message* msg = 0; // Message being read
155  const msg::Context* c_gnd_instant = 0;
156  wreport::Subset* subset = 0; // Subset being written
157 
158  Template(const dballe::ExporterOptions& opts, const Messages& msgs)
159  : opts(opts), msgs(msgs) {}
160  virtual ~Template() {}
161 
162  virtual const char* name() const = 0;
163  virtual const char* description() const = 0;
164  virtual void to_bulletin(wreport::Bulletin& bulletin);
165 };
166 
168 {
169  typedef std::function<std::unique_ptr<Template>(const dballe::ExporterOptions& opts, const Messages& msgs)> factory_func;
170 
171  unsigned data_category = MISSING_INT;
172  std::string name;
173  std::string description;
174  factory_func factory;
175 
176  TemplateFactory(unsigned data_category, std::string name, std::string description, factory_func factory)
177  : data_category(data_category), name(name), description(description), factory(factory) {}
178 };
179 
180 struct TemplateRegistry : public std::map<std::string, TemplateFactory>
181 {
182  static const TemplateRegistry& get();
183  static const TemplateFactory& get(const std::string& name);
184 
185  void register_factory(
186  unsigned data_category,
187  const std::string& name,
188  const std::string& desc,
189  TemplateFactory::factory_func fac);
190 };
191 
192 }
193 }
194 }
195 }
196 #endif
std::unique_ptr< wreport::Bulletin > make_bulletin() const override
Create a bulletin that works with this exporter.
Binary message.
Definition: file.h:130
std::unique_ptr< wreport::Bulletin > to_bulletin(const std::vector< std::shared_ptr< dballe::Message >> &msgs) const override
Import a decoded BUFR/CREX message.
Definition: wr_codec.h:23
Definition: wr_codec.h:167
Definition: wr_codec.h:114
Information on how a value has been sampled or computed with regards to time.
Definition: types.h:686
Definition: cmdline.h:18
Options to control message export.
Definition: exporter.h:24
Definition: importer.h:142
Definition: wr_codec.h:48
Definition: wr_codec.h:59
Options to control message import.
Definition: importer.h:24
Encoding encoding() const override
Return the encoding for this importer.
Definition: wr_codec.h:65
Vertical level or layer.
Definition: types.h:624
bool foreach_decoded_bulletin(const wreport::Bulletin &msg, std::function< bool(std::shared_ptr< dballe::Message >)> dest) const
Build Message objects a decoded bulletin, calling dest on each resulting Message. ...
Store an array of physical data all on the same level.
Definition: context.h:23
uint16_t Varcode
std::unique_ptr< wreport::Bulletin > make_bulletin() const override
Create a bulletin that works with this exporter.
Definition: wr_codec.h:90
const wreport::Var * find_station_var(wreport::Varcode code) const
Find a variable in c_station, or nullptr if not found.
Definition: shortcuts.h:11
static const ImporterOptions defaults
Default importer options.
Definition: importer.h:54
Definition: wr_codec.h:100
Definition: wr_codec.h:180
Definition: exporter.h:109
Storage for related physical data.
Definition: msg.h:130
std::unique_ptr< wr::Template > infer_template(const Messages &msgs) const
Infer a template name from the message contents.
Encoding encoding() const override
Return the encoding for this importer.
Definition: wr_codec.h:54
Collection of Value objects, indexed by wreport::Varcode.
Definition: values.h:176
Definition: wr_codec.h:74
std::vector< std::shared_ptr< dballe::Message > > from_bulletin(const wreport::Bulletin &msg) const override
Import a decoded BUFR/CREX message.