70 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #if !defined(MIJIN_UTIL_WINERR_HPP_INCLUDED)
 | |
| #define MIJIN_UTIL_WINERR_HPP_INCLUDED 1
 | |
| 
 | |
| #include <format>
 | |
| 
 | |
| #include <windows.h>
 | |
| #include "./winundef.hpp"
 | |
| 
 | |
| #include "./exception.hpp"
 | |
| 
 | |
| namespace mijin
 | |
| {
 | |
| 
 | |
| //
 | |
| // public types
 | |
| //
 | |
| 
 | |
| class HRException : public Exception
 | |
| {
 | |
| private:
 | |
|     HRESULT hResult_;
 | |
| public:
 | |
|     explicit inline HRException(HRESULT hResult);
 | |
|     inline HRException(std::string_view message, HRESULT hResult);
 | |
| };
 | |
| 
 | |
| //
 | |
| // public functions
 | |
| //
 | |
| 
 | |
| [[nodiscard]]
 | |
| inline std::string getHResultMessage(HRESULT hResult)
 | |
| {
 | |
|     if (hResult == S_OK)
 | |
|     {
 | |
|         return "Success (0x0)";
 | |
|     }
 | |
|     return std::format("Unknown error (0x{:x}", hResult);
 | |
| }
 | |
| 
 | |
| inline HRESULT ensureHR(HRESULT hResult, std::string_view message = {})
 | |
| {
 | |
|     if (!SUCCEEDED(hResult))
 | |
|     {
 | |
|         if (message.empty())
 | |
|         {
 | |
|             throw HRException(hResult);
 | |
|         }
 | |
|         throw HRException(message, hResult);
 | |
|     }
 | |
|     return hResult;
 | |
| }
 | |
| 
 | |
| HRException::HRException(HRESULT hResult) : Exception(getHResultMessage(hResult)), hResult_(hResult)
 | |
| {
 | |
| 
 | |
| }
 | |
| 
 | |
| HRException::HRException(std::string_view message, HRESULT hResult)
 | |
|     : Exception(std::format("{} {}", message, getHResultMessage(hResult))), hResult_(hResult)
 | |
| {
 | |
| 
 | |
| }
 | |
| }
 | |
| #endif // !defined(MIJIN_UTIL_WINERR_HPP_INCLUDED)
 |