#ifndef SOIL_MOISTURE_IO_H #define SOIL_MOISTURE_IO_H #include #include #include #include #include #include namespace trygvis { namespace soil_moisture { using namespace std; using namespace boost::asio; class Sample { public: Sample() : entries() { } Sample(map entries) : entries(entries) { } map::iterator find(string &s) { return entries.find(s); } map::iterator begin() { return entries.begin(); } map::iterator end() { return entries.end(); } string &operator[](string key) { return entries[key]; } private: map entries; }; class SampleOutputStream { public: virtual void write(Sample sample) = 0; }; class CsvSampleOutputStream : public SampleOutputStream { public: CsvSampleOutputStream(ostream &stream); CsvSampleOutputStream(ostream &stream, vector fields); void write(Sample values); private: void writeHeader(); ostream &stream; bool headerWritten; bool filterFields; vector fields; }; class JsonSampleOutputStream : public SampleOutputStream { public: JsonSampleOutputStream(ostream &stream); JsonSampleOutputStream(ostream &stream, vector fields); void write(Sample values); private: ostream &stream; bool filterFields; vector fields; }; class SqlSampleOutputStream : public SampleOutputStream { public: SqlSampleOutputStream(ostream &stream); SqlSampleOutputStream(ostream &stream, vector fields); void write(Sample values); private: ostream &stream; bool filterFields; vector fields; }; class CsvParser { public: CsvParser(shared_ptr output) : output(output), line(make_shared>()) { } void process(mutable_buffers_1 buffer); private: void process_line(shared_ptr> packet); static const uint8_t packet_delimiter = '\n'; shared_ptr output; shared_ptr> line; }; } } #endif