master
1const testing = @import("std").testing;
2
3const high_bit = 1 << @typeInfo(usize).int.bits - 1;
4
5pub const Status = enum(usize) {
6 /// The operation completed successfully.
7 success = 0,
8
9 /// The image failed to load.
10 load_error = high_bit | 1,
11
12 /// A parameter was incorrect.
13 invalid_parameter = high_bit | 2,
14
15 /// The operation is not supported.
16 unsupported = high_bit | 3,
17
18 /// The buffer was not the proper size for the request.
19 bad_buffer_size = high_bit | 4,
20
21 /// The buffer is not large enough to hold the requested data. The required buffer size is returned in the appropriate parameter when this error occurs.
22 buffer_too_small = high_bit | 5,
23
24 /// There is no data pending upon return.
25 not_ready = high_bit | 6,
26
27 /// The physical device reported an error while attempting the operation.
28 device_error = high_bit | 7,
29
30 /// The device cannot be written to.
31 write_protected = high_bit | 8,
32
33 /// A resource has run out.
34 out_of_resources = high_bit | 9,
35
36 /// An inconstancy was detected on the file system causing the operating to fail.
37 volume_corrupted = high_bit | 10,
38
39 /// There is no more space on the file system.
40 volume_full = high_bit | 11,
41
42 /// The device does not contain any medium to perform the operation.
43 no_media = high_bit | 12,
44
45 /// The medium in the device has changed since the last access.
46 media_changed = high_bit | 13,
47
48 /// The item was not found.
49 not_found = high_bit | 14,
50
51 /// Access was denied.
52 access_denied = high_bit | 15,
53
54 /// The server was not found or did not respond to the request.
55 no_response = high_bit | 16,
56
57 /// A mapping to a device does not exist.
58 no_mapping = high_bit | 17,
59
60 /// The timeout time expired.
61 timeout = high_bit | 18,
62
63 /// The protocol has not been started.
64 not_started = high_bit | 19,
65
66 /// The protocol has already been started.
67 already_started = high_bit | 20,
68
69 /// The operation was aborted.
70 aborted = high_bit | 21,
71
72 /// An ICMP error occurred during the network operation.
73 icmp_error = high_bit | 22,
74
75 /// A TFTP error occurred during the network operation.
76 tftp_error = high_bit | 23,
77
78 /// A protocol error occurred during the network operation.
79 protocol_error = high_bit | 24,
80
81 /// The function encountered an internal version that was incompatible with a version requested by the caller.
82 incompatible_version = high_bit | 25,
83
84 /// The function was not performed due to a security violation.
85 security_violation = high_bit | 26,
86
87 /// A CRC error was detected.
88 crc_error = high_bit | 27,
89
90 /// Beginning or end of media was reached
91 end_of_media = high_bit | 28,
92
93 /// The end of the file was reached.
94 end_of_file = high_bit | 31,
95
96 /// The language specified was invalid.
97 invalid_language = high_bit | 32,
98
99 /// The security status of the data is unknown or compromised and the data must be updated or replaced to restore a valid security status.
100 compromised_data = high_bit | 33,
101
102 /// There is an address conflict address allocation
103 ip_address_conflict = high_bit | 34,
104
105 /// A HTTP error occurred during the network operation.
106 http_error = high_bit | 35,
107
108 network_unreachable = high_bit | 100,
109
110 host_unreachable = high_bit | 101,
111
112 protocol_unreachable = high_bit | 102,
113
114 port_unreachable = high_bit | 103,
115
116 connection_fin = high_bit | 104,
117
118 connection_reset = high_bit | 105,
119
120 connection_refused = high_bit | 106,
121
122 /// The string contained one or more characters that the device could not render and were skipped.
123 warn_unknown_glyph = 1,
124
125 /// The handle was closed, but the file was not deleted.
126 warn_delete_failure = 2,
127
128 /// The handle was closed, but the data to the file was not flushed properly.
129 warn_write_failure = 3,
130
131 /// The resulting buffer was too small, and the data was truncated to the buffer size.
132 warn_buffer_too_small = 4,
133
134 /// The data has not been updated within the timeframe set by localpolicy for this type of data.
135 warn_stale_data = 5,
136
137 /// The resulting buffer contains UEFI-compliant file system.
138 warn_file_system = 6,
139
140 /// The operation will be processed across a system reset.
141 warn_reset_required = 7,
142
143 _,
144
145 pub const Error = error{
146 LoadError,
147 InvalidParameter,
148 Unsupported,
149 BadBufferSize,
150 BufferTooSmall,
151 NotReady,
152 DeviceError,
153 WriteProtected,
154 OutOfResources,
155 VolumeCorrupted,
156 VolumeFull,
157 NoMedia,
158 MediaChanged,
159 NotFound,
160 AccessDenied,
161 NoResponse,
162 NoMapping,
163 Timeout,
164 NotStarted,
165 AlreadyStarted,
166 Aborted,
167 IcmpError,
168 TftpError,
169 ProtocolError,
170 IncompatibleVersion,
171 SecurityViolation,
172 CrcError,
173 EndOfMedia,
174 EndOfFile,
175 InvalidLanguage,
176 CompromisedData,
177 IpAddressConflict,
178 HttpError,
179 NetworkUnreachable,
180 HostUnreachable,
181 ProtocolUnreachable,
182 PortUnreachable,
183 ConnectionFin,
184 ConnectionReset,
185 ConnectionRefused,
186 };
187
188 pub fn err(self: Status) Error!void {
189 switch (self) {
190 .load_error => return error.LoadError,
191 .invalid_parameter => return error.InvalidParameter,
192 .unsupported => return error.Unsupported,
193 .bad_buffer_size => return error.BadBufferSize,
194 .buffer_too_small => return error.BufferTooSmall,
195 .not_ready => return error.NotReady,
196 .device_error => return error.DeviceError,
197 .write_protected => return error.WriteProtected,
198 .out_of_resources => return error.OutOfResources,
199 .volume_corrupted => return error.VolumeCorrupted,
200 .volume_full => return error.VolumeFull,
201 .no_media => return error.NoMedia,
202 .media_changed => return error.MediaChanged,
203 .not_found => return error.NotFound,
204 .access_denied => return error.AccessDenied,
205 .no_response => return error.NoResponse,
206 .no_mapping => return error.NoMapping,
207 .timeout => return error.Timeout,
208 .not_started => return error.NotStarted,
209 .already_started => return error.AlreadyStarted,
210 .aborted => return error.Aborted,
211 .icmp_error => return error.IcmpError,
212 .tftp_error => return error.TftpError,
213 .protocol_error => return error.ProtocolError,
214 .incompatible_version => return error.IncompatibleVersion,
215 .security_violation => return error.SecurityViolation,
216 .crc_error => return error.CrcError,
217 .end_of_media => return error.EndOfMedia,
218 .end_of_file => return error.EndOfFile,
219 .invalid_language => return error.InvalidLanguage,
220 .compromised_data => return error.CompromisedData,
221 .ip_address_conflict => return error.IpAddressConflict,
222 .http_error => return error.HttpError,
223 .network_unreachable => return error.NetworkUnreachable,
224 .host_unreachable => return error.HostUnreachable,
225 .protocol_unreachable => return error.ProtocolUnreachable,
226 .port_unreachable => return error.PortUnreachable,
227 .connection_fin => return error.ConnectionFin,
228 .connection_reset => return error.ConnectionReset,
229 .connection_refused => return error.ConnectionRefused,
230 // success, warn_*, _
231 else => {},
232 }
233 }
234
235 pub fn fromError(e: Error) Status {
236 return switch (e) {
237 Error.Aborted => .aborted,
238 Error.AccessDenied => .access_denied,
239 Error.AlreadyStarted => .already_started,
240 Error.BadBufferSize => .bad_buffer_size,
241 Error.BufferTooSmall => .buffer_too_small,
242 Error.CompromisedData => .compromised_data,
243 Error.ConnectionFin => .connection_fin,
244 Error.ConnectionRefused => .connection_refused,
245 Error.ConnectionReset => .connection_reset,
246 Error.CrcError => .crc_error,
247 Error.DeviceError => .device_error,
248 Error.EndOfFile => .end_of_file,
249 Error.EndOfMedia => .end_of_media,
250 Error.HostUnreachable => .host_unreachable,
251 Error.HttpError => .http_error,
252 Error.IcmpError => .icmp_error,
253 Error.IncompatibleVersion => .incompatible_version,
254 Error.InvalidLanguage => .invalid_language,
255 Error.InvalidParameter => .invalid_parameter,
256 Error.IpAddressConflict => .ip_address_conflict,
257 Error.LoadError => .load_error,
258 Error.MediaChanged => .media_changed,
259 Error.NetworkUnreachable => .network_unreachable,
260 Error.NoMapping => .no_mapping,
261 Error.NoMedia => .no_media,
262 Error.NoResponse => .no_response,
263 Error.NotFound => .not_found,
264 Error.NotReady => .not_ready,
265 Error.NotStarted => .not_started,
266 Error.OutOfResources => .out_of_resources,
267 Error.PortUnreachable => .port_unreachable,
268 Error.ProtocolError => .protocol_error,
269 Error.ProtocolUnreachable => .protocol_unreachable,
270 Error.SecurityViolation => .security_violation,
271 Error.TftpError => .tftp_error,
272 Error.Timeout => .timeout,
273 Error.Unsupported => .unsupported,
274 Error.VolumeCorrupted => .volume_corrupted,
275 Error.VolumeFull => .volume_full,
276 Error.WriteProtected => .write_protected,
277 };
278 }
279};
280
281test "status" {
282 var st: Status = .device_error;
283 try testing.expectError(error.DeviceError, st.err());
284 try testing.expectEqual(st, Status.fromError(st.err()));
285
286 st = .success;
287 try st.err();
288
289 st = .warn_unknown_glyph;
290 try st.err();
291}