#ifndef ERROR_HPP #define ERROR_HPP #include "matador/utils/export.hpp" #include #include #include #include #include #include namespace matador::utils { class MATADOR_UTILS_API error final { public: error() = default; template , int> = 0> explicit error(ErrorEnumType err, const std::string& msg = "") : error(err, std::vector{}, msg) {} template , int> = 0> error(ErrorEnumType err, std::vector trace, std::string msg = "") : ec_(make_error_code(err)) , error_message_(std::move(msg)) , error_trace_(std::move(trace)) {} template , int> = 0> error(ErrorEnumType err, error error_trace, const std::string& msg = "") : error(err, std::vector{std::move(error_trace)}, msg) {} template , int> = 0> error(ErrorEnumType err, std::unordered_map infos, std::string msg = "") : ec_(make_error_code(err)) , error_message_(std::move(msg)) , error_infos_(std::move(infos)) {} error(const error&) = default; error(error&&) noexcept = default; error& operator=(const error&) = default; error& operator=(error&&) noexcept = default; ~error() = default; friend bool operator==(const error &lhs, const error &rhs); friend bool operator==(const error &lhs, const std::error_code &rhs); friend bool operator==(const error &lhs, const std::error_condition &rhs); friend bool operator!=(const error &lhs, const error &rhs); friend bool operator!=(const error &lhs, const std::error_code &rhs); friend bool operator!=(const error &lhs, const std::error_condition &rhs); friend bool operator<(const error &lhs, const error &rhs); friend bool operator<(const error &lhs, const std::error_code &rhs); // friend std::ostream& operator<<(std::ostream &out, const error &err); [[nodiscard]] std::string message() const; [[nodiscard]] std::string category() const; [[nodiscard]] std::error_code ec() const; [[nodiscard]] const std::vector& error_trace() const; [[nodiscard]] std::optional error_info(const std::string &key) const; void add_error_info(const std::string &key, std::string value); void remove_error_info(const std::string &key); [[nodiscard]] std::vector error_info_keys() const; private: std::error_code ec_; std::string error_message_; std::vector error_trace_; std::unordered_map error_infos_; }; } #endif //ERROR_HPP