#pragma once #include #include "result.hpp" #include "span.hpp" #include "table.hpp" namespace database { class TableReader { public: enum ReadError { OUT_OF_RANGE, IO_ERROR, PARSE_ERROR, }; auto ReadEntryAtIndex(Index_t index) -> cpp::result; template auto ReadColumnOffsetAtIndex(Column col, Index_t index) -> cpp::result; template auto ParseColumnAtIndex(Column col, Index_t index) -> cpp::result { return ReadColumnOffsetAtIndex(col, index).map([&](IndexOffset_t offset) { return ReadColumnAtOffset(col, offset); }); } template auto ParseColumnAtOffset(Column col, IndexOffset_t offset) -> cpp::result { return ReadDataAtOffset(col.Filename(), offset) .flat_map([&](cpp::span data) { auto res = = col.ParseValue(data); if (res) { return *res; } else { return cpp::fail(PARSE_ERROR); } }); } private: auto ReadDataAtOffset(std::string filename, IndexOffset_t offset) -> cpp::span; }; } // namespace database