1 module vulkanish.helpers.error; 2 3 import erupted; 4 import std.traits; 5 import std.meta; 6 7 class AnyVshError : Exception { 8 this(string msg, string file = __FILE__, size_t line = __LINE__) { 9 super(msg, file, line); 10 } 11 } 12 class VshErrorErrorCode : AnyVshError { 13 this(string msg, string file = __FILE__, size_t line = __LINE__) { 14 super(msg, file, line); 15 } 16 } 17 class VshErrorSuccessCode : AnyVshError { 18 this(string msg, string file = __FILE__, size_t line = __LINE__) { 19 super(msg, file, line); 20 } 21 } 22 template VshErrorBase(VkResult errorCode) { 23 static if (errorCode < 0) 24 alias VshErrorBase = VshErrorErrorCode; 25 else 26 alias VshErrorBase = VshErrorSuccessCode; 27 } 28 static foreach (i, code; NoDuplicates!(EnumMembers!VkResult)) { 29 mixin("class VshError_"~__traits(allMembers, VkResult)[i][3..$]~" : VshErrorBase!"~__traits(allMembers, VkResult)[i]~"{ 30 this(string msg=\"\", string file = __FILE__, size_t line = __LINE__) { 31 super(\"Vulkan Error: "~__traits(allMembers, VkResult)[i]~": \"~msg, file, line); 32 } 33 }"); 34 } 35 template VshError(VkResult errorCode) { 36 static foreach (i, code; NoDuplicates!(EnumMembers!VkResult)) 37 static if (errorCode == code) 38 mixin("alias VshError = VshError_"~__traits(allMembers, VkResult)[i][3..$]~";"); 39 } 40 41 void vshAssert(VkResult errorCode) { 42 version(assert) { 43 if (errorCode == VK_SUCCESS) 44 return; 45 final switch (errorCode) { 46 static foreach (i, code; NoDuplicates!(EnumMembers!VkResult)) 47 case code: 48 throw new VshError!code; 49 } 50 } 51 } 52 void vshEnforce(VkResult errorCode) { 53 if (errorCode == VK_SUCCESS) 54 return; 55 final switch (errorCode) { 56 static foreach (i, code; NoDuplicates!(EnumMembers!VkResult)) 57 case code: 58 throw new VshError!code(); 59 } 60 }