diff options
Diffstat (limited to 'src/database/include/table_reader.hpp')
| -rw-r--r-- | src/database/include/table_reader.hpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/database/include/table_reader.hpp b/src/database/include/table_reader.hpp new file mode 100644 index 00000000..9f7cc4ee --- /dev/null +++ b/src/database/include/table_reader.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include <string> + +#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<DatabaseEntry, ReadError>; + + template <typename T> + auto ReadColumnOffsetAtIndex(Column<T> col, Index_t index) + -> cpp::result<IndexOffset_t, ReadError>; + + template <typename T> + auto ParseColumnAtIndex(Column<T> col, Index_t index) + -> cpp::result<T, ReadError> { + return ReadColumnOffsetAtIndex(col, index).map([&](IndexOffset_t offset) { + return ReadColumnAtOffset(col, offset); + }); + } + + template <typename T> + auto ParseColumnAtOffset(Column<T> col, IndexOffset_t offset) + -> cpp::result<T, ReadError> { + return ReadDataAtOffset(col.Filename(), offset) + .flat_map([&](cpp::span<std::byte> 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<std::byte>; +}; + +} // namespace database |
