Iros
 
Loading...
Searching...
No Matches
error.h
Go to the documentation of this file.
1#pragma once
2
3#include <iris/uapi/error.h>
4
7
8namespace di::platform {
10
11class GenericDomain;
12
13using GenericCode = vocab::StatusCode<GenericDomain>;
14
16private:
17 using Base = vocab::StatusCodeDomain;
18
19public:
22
23 constexpr explicit GenericDomain(UniqueId id = 0xff261d32b71e0a8a) : Base(id) {}
24
25 GenericDomain(GenericDomain const&) = default;
27
28 auto operator=(GenericDomain const&) -> GenericDomain& = default;
29 auto operator=(GenericDomain&&) -> GenericDomain& = default;
30
31 constexpr static auto get() -> GenericDomain const&;
32
33 auto name() const -> di::container::ErasedString override { return container::ErasedString(u8"Posix) Domain"); }
34
35 auto payload_info() const -> PayloadInfo override {
36 return { sizeof(Value), sizeof(Value) + sizeof(StatusCodeDomain const*),
37 di::container::max(alignof(Value), alignof(StatusCodeDomain const*)) };
38 }
39
40protected:
41 constexpr auto do_failure(vocab::StatusCode<void> const& code) const -> bool override {
42 return down_cast(code).value() != BasicError::Success;
43 }
44
45 constexpr auto do_equivalent(vocab::StatusCode<void> const& a, vocab::StatusCode<void> const& b) const
46 -> bool override {
47 DI_ASSERT(a.domain() == *this);
48 return b.domain() == *this && down_cast(a).value() == down_cast(b).value();
49 }
50
51 constexpr auto do_convert_to_generic(vocab::StatusCode<void> const& a) const -> vocab::GenericCode override {
52 DI_ASSERT(a.domain() == *this);
53 return vocab::GenericCode(di::in_place, down_cast(a).value());
54 }
55
56 // NOLINTNEXTLINE(readability-function-cognitive-complexity)
57 constexpr auto do_message(vocab::StatusCode<void> const& code) const -> di::container::ErasedString override {
58 auto value = down_cast(code).value();
59 if (value == BasicError::Success) {
60 return container::ErasedString(u8"Success");
61 }
62 if (value == BasicError::AddressFamilyNotSupported) {
63 return container::ErasedString(u8"Address familty not supported");
64 }
65 if (value == BasicError::AddressInUse) {
66 return container::ErasedString(u8"Address in use");
67 }
68 if (value == BasicError::AddressNotAvailable) {
69 return container::ErasedString(u8"Address not available");
70 }
71 if (value == BasicError::AlreadyConnected) {
72 return container::ErasedString(u8"Already connected");
73 }
74 if (value == BasicError::ArgumentListTooLong) {
75 return container::ErasedString(u8"Argument list too long");
76 }
77 if (value == BasicError::ArgumentOutOfDomain) {
78 return container::ErasedString(u8"Argument out of domain");
79 }
80 if (value == BasicError::BadAddress) {
81 return container::ErasedString(u8"Bad address");
82 }
83 if (value == BasicError::BadFileDescriptor) {
84 return container::ErasedString(u8"Bad file descriptor");
85 }
86 if (value == BasicError::BadMessage) {
87 return container::ErasedString(u8"Bad message");
88 }
89 if (value == BasicError::BrokenPipe) {
90 return container::ErasedString(u8"Broken pipe");
91 }
92 if (value == BasicError::ConnectionAborted) {
93 return container::ErasedString(u8"Connect aborted");
94 }
95 if (value == BasicError::ConnectionAlreadyInProgress) {
96 return container::ErasedString(u8"Connection already in progress");
97 }
98 if (value == BasicError::ConnectionRefused) {
99 return container::ErasedString(u8"Connection refused");
100 }
101 if (value == BasicError::ConnectionReset) {
102 return container::ErasedString(u8"Connection reset");
103 }
104 if (value == BasicError::CrossDeviceLink) {
105 return container::ErasedString(u8"Cross device link");
106 }
107 if (value == BasicError::DestinationAddressRequired) {
108 return container::ErasedString(u8"Destination address required");
109 }
110 if (value == BasicError::DeviceOrResourceBusy) {
111 return container::ErasedString(u8"Device or resource busy");
112 }
113 if (value == BasicError::DirectoryNotEmpty) {
114 return container::ErasedString(u8"Directory not empty");
115 }
116 if (value == BasicError::ExecutableFormatError) {
117 return container::ErasedString(u8"Executable format error");
118 }
119 if (value == BasicError::FileExists) {
120 return container::ErasedString(u8"File exists");
121 }
122 if (value == BasicError::FileTooLarge) {
123 return container::ErasedString(u8"File too large");
124 }
125 if (value == BasicError::FilenameTooLong) {
126 return container::ErasedString(u8"Filename too long");
127 }
128 if (value == BasicError::FunctionNotSupported) {
129 return container::ErasedString(u8"Function not supported");
130 }
131 if (value == BasicError::HostUnreachable) {
132 return container::ErasedString(u8"Host unreachable");
133 }
134 if (value == BasicError::IdentifierRemoved) {
135 return container::ErasedString(u8"Identifier removed");
136 }
137 if (value == BasicError::IllegalByteSequence) {
138 return container::ErasedString(u8"Illegal byte sequence");
139 }
140 if (value == BasicError::InappropriateIoControlOperation) {
141 return container::ErasedString(u8"Inappropriate io control operation");
142 }
143 if (value == BasicError::Interrupted) {
144 return container::ErasedString(u8"Interrupted");
145 }
146 if (value == BasicError::InvalidArgument) {
147 return container::ErasedString(u8"Invalid argument");
148 }
149 if (value == BasicError::InvalidSeek) {
150 return container::ErasedString(u8"Invalid seek");
151 }
152 if (value == BasicError::IoError) {
153 return container::ErasedString(u8"IO error");
154 }
155 if (value == BasicError::IsADirectory) {
156 return container::ErasedString(u8"Is a directory");
157 }
158 if (value == BasicError::MessageSize) {
159 return container::ErasedString(u8"Message size");
160 }
161 if (value == BasicError::NetworkDown) {
162 return container::ErasedString(u8"Network down");
163 }
164 if (value == BasicError::NetworkReset) {
165 return container::ErasedString(u8"Network reset");
166 }
167 if (value == BasicError::NetworkUnreachable) {
168 return container::ErasedString(u8"Network unreachable");
169 }
170 if (value == BasicError::NoBufferSpace) {
171 return container::ErasedString(u8"No buffer space");
172 }
173 if (value == BasicError::NoChildProcess) {
174 return container::ErasedString(u8"No child process");
175 }
176 if (value == BasicError::NoLink) {
177 return container::ErasedString(u8"No link");
178 }
179 if (value == BasicError::NoLockAvailable) {
180 return container::ErasedString(u8"No lock available");
181 }
182 if (value == BasicError::NoMessageAvailable) {
183 return container::ErasedString(u8"No message available");
184 }
185 if (value == BasicError::NoMessage) {
186 return container::ErasedString(u8"No message");
187 }
188 if (value == BasicError::NoProtocolOption) {
189 return container::ErasedString(u8"No protocol option");
190 }
191 if (value == BasicError::NoSpaceOnDevice) {
192 return container::ErasedString(u8"No space on device");
193 }
194 if (value == BasicError::NoStreamResources) {
195 return container::ErasedString(u8"No stream resources");
196 }
197 if (value == BasicError::NoSuchDeviceOrAddress) {
198 return container::ErasedString(u8"No such device or address");
199 }
200 if (value == BasicError::NoSuchDevice) {
201 return container::ErasedString(u8"No such device");
202 }
203 if (value == BasicError::NoSuchFileOrDirectory) {
204 return container::ErasedString(u8"No such file or directory");
205 }
206 if (value == BasicError::NoSuchProcess) {
207 return container::ErasedString(u8"No such process");
208 }
209 if (value == BasicError::NotADirectory) {
210 return container::ErasedString(u8"Not a directory");
211 }
212 if (value == BasicError::NotASocket) {
213 return container::ErasedString(u8"Not a socket");
214 }
215 if (value == BasicError::NotAStream) {
216 return container::ErasedString(u8"Not a stream");
217 }
218 if (value == BasicError::NotConnected) {
219 return container::ErasedString(u8"Not connected");
220 }
221 if (value == BasicError::NotEnoughMemory) {
222 return container::ErasedString(u8"Not enough memory");
223 }
224 if (value == BasicError::OperationCanceled) {
225 return container::ErasedString(u8"Operation cancelled");
226 }
227 if (value == BasicError::OperationInProgress) {
228 return container::ErasedString(u8"Operation in progress");
229 }
230 if (value == BasicError::OperationNotPermitted) {
231 return container::ErasedString(u8"Operation not permitted");
232 }
233 if (value == BasicError::NotSupported) {
234 return container::ErasedString(u8"Not supported");
235 }
236 if (value == BasicError::OperationNotSupported) {
237 return container::ErasedString(u8"Operation not supported");
238 }
239 if (value == BasicError::OperationWouldBlock) {
240 return container::ErasedString(u8"Operation would block");
241 }
242 if (value == BasicError::OwnerDead) {
243 return container::ErasedString(u8"Owner dead");
244 }
245 if (value == BasicError::PermissionDenied) {
246 return container::ErasedString(u8"Permission denied");
247 }
248 if (value == BasicError::ProtocolError) {
249 return container::ErasedString(u8"Protocol error");
250 }
251 if (value == BasicError::ProtocolNotSupported) {
252 return container::ErasedString(u8"Protocol not supported");
253 }
254 if (value == BasicError::ReadOnlyFileSystem) {
255 return container::ErasedString(u8"Read only file system");
256 }
257 if (value == BasicError::ResourceDeadlockWouldOccur) {
258 return container::ErasedString(u8"Resource deadlock would occur");
259 }
260 if (value == BasicError::ResourceUnavailableTryAgain) {
261 return container::ErasedString(u8"Resource unavailable try again");
262 }
263 if (value == BasicError::ResultOutOfRange) {
264 return container::ErasedString(u8"Result out of range");
265 }
266 if (value == BasicError::StateNotRecoverable) {
267 return container::ErasedString(u8"State not recoverable");
268 }
269 if (value == BasicError::StreamTimeout) {
270 return container::ErasedString(u8"Stream timeout");
271 }
272 if (value == BasicError::TextFileBusy) {
273 return container::ErasedString(u8"Text file busy");
274 }
275 if (value == BasicError::TimedOut) {
276 return container::ErasedString(u8"Timed out");
277 }
278 if (value == BasicError::TooManyFilesOpenInSystem) {
279 return container::ErasedString(u8"Too many files open in system");
280 }
281 if (value == BasicError::TooManyFilesOpen) {
282 return container::ErasedString(u8"Too many files open");
283 }
284 if (value == BasicError::TooManyLinks) {
285 return container::ErasedString(u8"Too many links");
286 }
287 if (value == BasicError::TooManySymbolicLinkLevels) {
288 return container::ErasedString(u8"Too many symbolic link levels");
289 }
290 if (value == BasicError::ValueTooLarge) {
291 return container::ErasedString(u8"Value too large");
292 }
293 if (value == BasicError::WrongProtocolType) {
294 return container::ErasedString(u8"Wrong protocol type");
295 }
296 return container::ErasedString(u8"(Unknown)");
297 }
298
299private:
300 template<typename Domain>
302
303 constexpr auto down_cast(vocab::StatusCode<void> const& code) const -> GenericCode const& {
304 DI_ASSERT(code.domain() == *this);
305 return static_cast<GenericCode const&>(code);
306 }
307};
308
309constexpr inline auto posix_domain = GenericDomain {};
310
311constexpr auto GenericDomain::get() -> GenericDomain const& {
312 return posix_domain;
313}
314}
315
316namespace di::vocab::detail {
319}
320}
321
322namespace iris {
323template<typename T>
325}
326
327namespace di::vocab {
328constexpr auto StatusCode<void>::generic_code() const -> GenericCode {
329 if (!this->empty()) {
330 return this->domain().do_convert_to_generic(*this);
331 }
332 return GenericCode(di::in_place, platform::BasicError::InvalidArgument);
333}
334}
335
336#if __GNUC__ >= 13
337// NOTE: GCC 13 thinks that calling DI_TRY() on a di::Result<int&> produces a dangling reference, because the result
338// object gets destroyed before the reference is used. However, di::Result<int&> is essentially a pointer type, so this
339// is not a problem. Unfortunately, since this occurs in a macro, this warning cannot be suppressed only inside this
340// header file.
341#pragma GCC diagnostic ignored "-Wdangling-reference"
342#endif
343
344#define TRY_UNERASE_ERROR(...) \
345 __extension__({ \
346 auto __result = (__VA_ARGS__); \
347 if (!__result) { \
348 return ::di::Unexpected(::di::util::move(__result).error().generic_code()); \
349 } \
350 ::di::util::move(__result).__try_did_succeed(); \
351 }).__try_move_out()
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition erased_string.h:21
Definition error.h:15
constexpr GenericDomain(UniqueId id=0x25657faae58bbe11)
Definition default_generic_domain.h:29
static constexpr auto get() -> GenericDomain const &
auto operator=(GenericDomain &&) -> GenericDomain &=default
Base::UniqueId UniqueId
Definition default_generic_domain.h:27
constexpr auto do_equivalent(vocab::StatusCode< void > const &a, vocab::StatusCode< void > const &b) const -> bool override
Definition error.h:45
auto payload_info() const -> PayloadInfo override
Definition error.h:35
auto operator=(GenericDomain const &) -> GenericDomain &=default
constexpr auto do_convert_to_generic(vocab::StatusCode< void > const &a) const -> vocab::GenericCode override
Definition error.h:51
auto name() const -> di::container::ErasedString override
Definition error.h:33
GenericDomain(GenericDomain const &)=default
static constexpr auto get() -> GenericDomain const &
Definition default_generic_domain.h:108
BasicError Value
Definition default_generic_domain.h:26
constexpr auto do_message(vocab::StatusCode< void > const &code) const -> di::container::ErasedString override
Definition error.h:57
constexpr auto do_failure(vocab::StatusCode< void > const &code) const -> bool override
Definition error.h:41
constexpr GenericDomain(UniqueId id=0xff261d32b71e0a8a)
Definition error.h:23
GenericDomain(GenericDomain &&)=default
Definition expected_forward_declaration.h:8
Definition status_code_domain.h:8
constexpr StatusCodeDomain(UniqueId id)
Definition status_code_domain.h:29
constexpr auto id() const
Definition status_code_domain.h:12
u64 UniqueId
Definition status_code_domain.h:10
Definition status_code_forward_declaration.h:11
constexpr auto generic_code() const -> GenericCode
Definition default_generic_domain.h:114
Definition sequence.h:12
constexpr auto max
Definition max.h:47
BasicError
Definition default_generic_domain.h:10
Definition custom.h:30
vocab::StatusCode< GenericDomain > GenericCode
Definition error.h:14
constexpr auto posix_domain
Definition error.h:309
__UINT8_TYPE__ u8
Definition integers.h:9
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition erasure_cast.h:7
Definition lazy.h:165
StatusCode< platform::GenericDomain > GenericCode
Definition status_code_forward_declaration.h:13
Definition zstring_parser.h:9
constexpr auto empty
Definition empty.h:45
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto in_place
Definition in_place.h:8
Definition cxx_init.cpp:12
Error
Definition error.h:4
di::vocab::Expected< T, di::platform::GenericCode > Expected
Definition error.h:324
Definition status_code_domain.h:16