#ifndef CSV_HH #define CSV_HH #include "io.hh" // IWYU pragma: export #include "line.hh" #include #include #include #include namespace csv { // Note that this reader is very simple, no quotes or escapes. // Empty lines are ignored. class Reader { public: virtual ~Reader() = default; // Returned span is only valid until next call to read. // Returns empty span at end-of-file and only then. [[nodiscard]] virtual std::expected, io::ReadError> read() = 0; // Starts at zero. Returns next line. // So, before first read it is zero, after first read it is one. [[nodiscard]] virtual uint64_t number() const = 0; protected: Reader() = default; Reader(Reader const&) = delete; Reader& operator=(Reader const&) = delete; }; [[nodiscard]] std::unique_ptr open(std::unique_ptr reader, char separator = ','); [[nodiscard]] std::unique_ptr open(std::unique_ptr reader, char separator = ','); } // namespace csv #endif // CSV_HH