| | |
| | |
| |
|
| | #pragma once |
| |
|
| | #include <exception> |
| | #include <string> |
| | #include <utility> |
| |
|
| | #include "common/logging/formatter.h" |
| |
|
| | namespace Shader { |
| |
|
| | class Exception : public std::exception { |
| | public: |
| | explicit Exception(std::string message) noexcept : err_message{std::move(message)} {} |
| |
|
| | [[nodiscard]] const char* what() const noexcept override { |
| | return err_message.c_str(); |
| | } |
| |
|
| | void Prepend(std::string_view prepend) { |
| | err_message.insert(0, prepend); |
| | } |
| |
|
| | void Append(std::string_view append) { |
| | err_message += append; |
| | } |
| |
|
| | private: |
| | std::string err_message; |
| | }; |
| |
|
| | class LogicError : public Exception { |
| | public: |
| | template <typename... Args> |
| | explicit LogicError(const char* message, Args&&... args) |
| | : Exception{fmt::format(fmt::runtime(message), std::forward<Args>(args)...)} {} |
| | }; |
| |
|
| | class RuntimeError : public Exception { |
| | public: |
| | template <typename... Args> |
| | explicit RuntimeError(const char* message, Args&&... args) |
| | : Exception{fmt::format(fmt::runtime(message), std::forward<Args>(args)...)} {} |
| | }; |
| |
|
| | class NotImplementedException : public Exception { |
| | public: |
| | template <typename... Args> |
| | explicit NotImplementedException(const char* message, Args&&... args) |
| | : Exception{fmt::format(fmt::runtime(message), std::forward<Args>(args)...)} { |
| | Append(" is not implemented"); |
| | } |
| | }; |
| |
|
| | class InvalidArgument : public Exception { |
| | public: |
| | template <typename... Args> |
| | explicit InvalidArgument(const char* message, Args&&... args) |
| | : Exception{fmt::format(fmt::runtime(message), std::forward<Args>(args)...)} {} |
| | }; |
| |
|
| | } |
| |
|