#pragma once #include #include #include #include #include #include #include #include #include #include namespace ovdl::csv { class Parser final : public detail::BasicParser { public: Parser(); Parser(std::basic_ostream& error_stream); static Parser from_buffer(const char* data, std::size_t size, std::optional encoding_fallback = std::nullopt); static Parser from_buffer(const char* start, const char* end, std::optional encoding_fallback = std::nullopt); static Parser from_string(const std::string_view string, std::optional encoding_fallback = std::nullopt); static Parser from_file(const char* path, std::optional encoding_fallback = std::nullopt); static Parser from_file(const std::filesystem::path& path, std::optional encoding_fallback = std::nullopt); constexpr Parser& load_from_buffer(const char* data, std::size_t size, std::optional encoding_fallback = std::nullopt); constexpr Parser& load_from_buffer(const char* start, const char* end, std::optional encoding_fallback = std::nullopt); constexpr Parser& load_from_string(const std::string_view string, std::optional encoding_fallback = std::nullopt); Parser& load_from_file(const char* path, std::optional encoding_fallback = std::nullopt); Parser& load_from_file(const std::filesystem::path& path, std::optional encoding_fallback = std::nullopt); constexpr Parser& load_from_file(const detail::HasCstr auto& path, std::optional encoding_fallback = std::nullopt) { return load_from_file(path.c_str(), encoding_fallback); } bool parse_csv(bool handle_strings = false); const std::vector& get_lines() const; using error_range = ovdl::detail::error_range; Parser::error_range get_errors() const; const FilePosition get_error_position(const error::Error* error) const; void print_errors_to(std::basic_ostream& stream) const; Parser(Parser&&); Parser& operator=(Parser&&); ~Parser(); private: class ParseHandler; std::unique_ptr _parse_handler; template constexpr void _run_load_func(detail::LoadCallback auto func, Args... args); }; }