From b7764c3a796e53ac74009bc7d7cd153c64b6d743 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Thu, 27 May 2021 17:51:00 -0300
Subject: shader: Handle host exceptions

---
 src/shader_recompiler/exception.h | 40 +++++++++++++++++++++++++++++++--------
 1 file changed, 32 insertions(+), 8 deletions(-)

(limited to 'src/shader_recompiler/exception.h')

diff --git a/src/shader_recompiler/exception.h b/src/shader_recompiler/exception.h
index 6fe620801d..013d7b1bfe 100644
--- a/src/shader_recompiler/exception.h
+++ b/src/shader_recompiler/exception.h
@@ -5,38 +5,62 @@
 #pragma once
 
 #include <stdexcept>
+#include <string>
+#include <string_view>
 #include <utility>
 
 #include <fmt/format.h>
 
 namespace Shader {
 
-class LogicError : public std::logic_error {
+class Exception : public std::exception {
+public:
+    explicit Exception(std::string message_) noexcept : message{std::move(message_)} {}
+
+    const char* what() const override {
+        return message.c_str();
+    }
+
+    void Prepend(std::string_view prepend) {
+        message.insert(0, prepend);
+    }
+
+    void Append(std::string_view append) {
+        message += append;
+    }
+
+private:
+    std::string message;
+};
+
+class LogicError : public Exception {
 public:
     template <typename... Args>
     LogicError(const char* message, Args&&... args)
-        : std::logic_error{fmt::format(message, std::forward<Args>(args)...)} {}
+        : Exception{fmt::format(message, std::forward<Args>(args)...)} {}
 };
 
-class RuntimeError : public std::runtime_error {
+class RuntimeError : public Exception {
 public:
     template <typename... Args>
     RuntimeError(const char* message, Args&&... args)
-        : std::runtime_error{fmt::format(message, std::forward<Args>(args)...)} {}
+        : Exception{fmt::format(message, std::forward<Args>(args)...)} {}
 };
 
-class NotImplementedException : public std::logic_error {
+class NotImplementedException : public Exception {
 public:
     template <typename... Args>
     NotImplementedException(const char* message, Args&&... args)
-        : std::logic_error{fmt::format(message, std::forward<Args>(args)...)} {}
+        : Exception{fmt::format(message, std::forward<Args>(args)...)} {
+        Append(" is not implemented");
+    }
 };
 
-class InvalidArgument : public std::invalid_argument {
+class InvalidArgument : public Exception {
 public:
     template <typename... Args>
     InvalidArgument(const char* message, Args&&... args)
-        : std::invalid_argument{fmt::format(message, std::forward<Args>(args)...)} {}
+        : Exception{fmt::format(message, std::forward<Args>(args)...)} {}
 };
 
 } // namespace Shader
-- 
cgit v1.2.3-70-g09d2