#include "csv.hh" #include "line.hh" #include "str.hh" #include #include #include #include #include #include #include namespace csv { namespace { class ReaderImpl : public Reader { public: ReaderImpl(std::unique_ptr reader, char separator) : reader_(std::move(reader)), separator_(separator) {} [[nodiscard]] std::expected, io::ReadError> read() override { while (true) { auto line = reader_->read(); if (line.has_value()) { str::split(line.value(), line_, separator_, /* keep_empty */ true); if (line_.size() == 1 && line_[0].empty()) continue; return line_; } if (line.error() == io::ReadError::Eof) { return {}; } return std::unexpected(line.error()); } } [[nodiscard]] uint64_t number() const override { return reader_->number(); } private: std::unique_ptr reader_; char const separator_; std::vector line_; }; } // namespace std::unique_ptr open(std::unique_ptr reader, char separator) { return std::make_unique(std::move(reader), separator); } std::unique_ptr open(std::unique_ptr reader, char separator) { return open(line::open(std::move(reader)), separator); } } // namespace csv