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 }