Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
PluginError.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4
5#include "../Common/Result.h"
6
7namespace SC
8{
11
13enum class PluginError : uint32_t
14{
15 PathNotNullTerminated = 1,
16 UnsupportedPathEncoding,
17 InvalidDefinition,
18 DynamicLibraryOperationUnsupported,
19 PathCapacityExceeded,
20 DefinitionCapacityExceeded,
21 ScannerCapacityExceeded,
22 RegistryCapacityExceeded,
23 CompilerConfigurationCapacityExceeded,
24 SysrootCapacityExceeded,
25 ArgumentCapacityExceeded,
26 FileOpenFailed,
27 FileSizeQueryFailed,
28 FileBufferCapacityExceeded,
29 FileReadFailed,
30 FileReadIncomplete,
31 FileRemoveFailed,
32 DirectoryOpenFailed,
33 DirectoryReadFailed,
34 CompilerNotFound,
35 SysrootNotFound,
36 CompilerEnvironmentReadFailed,
37 CompilerExitedWithFailure,
38 LinkerExitedWithFailure,
39 DynamicLibraryAlreadyLoaded,
40 DynamicLibraryLoadFailed,
41 DynamicLibraryCloseFailed,
42 DynamicLibraryNotLoaded,
43 SymbolNameConversionFailed,
44 SymbolNameCapacityExceeded,
45 SymbolNotFound,
46 InitializationEntryPointNotFound,
47 CloseEntryPointNotFound,
48 PluginNotFound,
49 PluginInitializationFailed,
50 PluginShutdownFailed,
51 DebuggerUnlockFailed,
52 ReloadUnsupported,
53};
54
56enum class PluginErrorDetail : uint16_t
57{
58 None = 0,
59 PathAssign,
60 PathAppend,
61 MetadataName,
62 MetadataVersion,
63 MetadataDescription,
64 MetadataCategory,
65 MetadataDependency,
66 MetadataBuildOption,
67 ScannerDefinitionStorage,
68 ScannerCandidatePath,
69 ScannerCandidateFile,
70 IteratorAssignDirectory,
71 IteratorBuildSearchPath,
72 IteratorBuildEntryPath,
73 CompilerFindConfiguration,
74 CompilerBuildArguments,
75 CompilerWriteArguments,
76 CompilerBuildObjectPath,
77 LinkerBuildArguments,
78 LinkerWriteArguments,
79 LinkerBuildOutputPath,
80 SysrootFindVersion,
81 SysrootBuildIncludePath,
82 SysrootBuildLibraryPath,
83 RegistryUnloadList,
84 RegistryStoreDefinition,
85 RegistryFindPlugin,
86 WindowsFileCreate,
87 WindowsFileGetSize,
88 WindowsFileRead,
89 WindowsFileDelete,
90 PosixFileOpen,
91 PosixFileStat,
92 PosixFileRead,
93 PosixFileRemove,
94 WindowsDirectoryFindFirst,
95 WindowsDirectoryFindNext,
96 PosixDirectoryOpen,
97 PosixDirectoryRead,
98 WindowsDynamicLibraryLoad,
99 WindowsDynamicLibraryClose,
100 WindowsDynamicLibraryGetSymbol,
101 PosixDynamicLibraryLoad,
102 PosixDynamicLibraryClose,
103 PosixDynamicLibraryGetSymbol,
104 WindowsSymbolNameConversion,
105 PosixSymbolNameAssign,
106 WindowsDebuggerUnlock,
107 WindowsDebuggerDelete,
108};
109
111enum class PluginErrorContextKind : uint16_t
112{
113 None = 0,
114 NativeError,
115 ExitCode,
116 RequiredBytes,
117 RequiredElements,
118};
119
122{
123 struct ExitCode
124 {
125 };
127 {
128 };
130 {
131 };
132
133 uint32_t nativeError;
134 int32_t exitCode;
135 uint32_t requiredBytes;
136 uint32_t requiredElements;
137
138 constexpr PluginErrorContext(uint32_t value = 0) : nativeError(value) {}
139 constexpr PluginErrorContext(ExitCode, int32_t value) : exitCode(value) {}
140 constexpr PluginErrorContext(RequiredBytes, uint32_t value) : requiredBytes(value) {}
141 constexpr PluginErrorContext(RequiredElements, uint32_t value) : requiredElements(value) {}
142};
143
145static constexpr ResultCategory PluginResultCategory = ResultCategory(7);
146
150struct [[nodiscard]] ResultPlugin
151{
152 Result result;
153 PluginErrorDetail detail = PluginErrorDetail::None;
154 PluginErrorContextKind contextKind = PluginErrorContextKind::None;
155 PluginErrorContext context = {};
156
157 explicit constexpr ResultPlugin(bool valid = true) : result(valid) {}
158 constexpr ResultPlugin(PluginError error, PluginErrorDetail detail = PluginErrorDetail::None)
159 : result(Result::Error(PluginResultCategory, error)), detail(detail)
160 {}
161 constexpr ResultPlugin(PluginError error, PluginErrorDetail detail, PluginErrorContextKind contextKind,
162 PluginErrorContext context)
163 : result(Result::Error(PluginResultCategory, error)), detail(detail), contextKind(contextKind), context(context)
164 {}
165 constexpr ResultPlugin(Result result) : result(result) {}
166
167 template <typename ResultLike>
168 constexpr ResultPlugin(const ResultLike& other) : result(other.toResult())
169 {}
170
171 static constexpr ResultPlugin withNativeError(PluginError error, PluginErrorDetail detail, uint32_t nativeError)
172 {
173 return {error, detail, PluginErrorContextKind::NativeError, PluginErrorContext(nativeError)};
174 }
175
176 static constexpr ResultPlugin withExitCode(PluginError error, PluginErrorDetail detail, int32_t exitCode)
177 {
178 return {error, detail, PluginErrorContextKind::ExitCode,
180 }
181
182 static constexpr ResultPlugin withRequiredBytes(PluginError error, PluginErrorDetail detail, uint32_t requiredBytes)
183 {
184 return {error, detail, PluginErrorContextKind::RequiredBytes,
186 }
187
188 static constexpr ResultPlugin withRequiredElements(PluginError error, PluginErrorDetail detail,
189 uint32_t requiredElements)
190 {
191 return {error, detail, PluginErrorContextKind::RequiredElements,
193 }
194
195 explicit constexpr operator bool() const { return static_cast<bool>(result); }
196 constexpr operator Result() const { return result; }
197 constexpr Result toResult() const { return result; }
198 constexpr bool isError(PluginError error) const { return result.isError(PluginResultCategory, error); }
199};
200
202} // namespace SC
PluginErrorContextKind
Kind of the scalar diagnostic context stored in ResultPlugin.
Definition PluginError.h:112
PluginErrorDetail
Stable operation or backend stage retained for a Plugin failure.
Definition PluginError.h:57
PluginError
Stable portable failures returned by the Plugin library.
Definition PluginError.h:14
Definition PluginError.h:124
Definition PluginError.h:127
Definition PluginError.h:130
Plugin result retaining a stable operation detail and one scalar diagnostic context.
Definition PluginError.h:151
A typed scalar payload for a Plugin error. Its interpretation is selected by PluginErrorContextKind.
Definition PluginError.h:122