| use core::fmt::Debug; |
| |
| newtype_enum! { |
| /// UEFI uses status codes in order to report successes, errors, and warnings. |
| /// |
| /// The spec allows implementation-specific status codes, so the `Status` |
| /// constants are not a comprehensive list of all possible values. |
| #[must_use] |
| pub enum Status: usize => { |
| /// The operation completed successfully. |
| SUCCESS = 0, |
| |
| /// The string contained characters that could not be rendered and were skipped. |
| WARN_UNKNOWN_GLYPH = 1, |
| /// The handle was closed, but the file was not deleted. |
| WARN_DELETE_FAILURE = 2, |
| /// The handle was closed, but the data to the file was not flushed properly. |
| WARN_WRITE_FAILURE = 3, |
| /// The resulting buffer was too small, and the data was truncated. |
| WARN_BUFFER_TOO_SMALL = 4, |
| /// The data has not been updated within the timeframe set by local policy. |
| WARN_STALE_DATA = 5, |
| /// The resulting buffer contains UEFI-compliant file system. |
| WARN_FILE_SYSTEM = 6, |
| /// The operation will be processed across a system reset. |
| WARN_RESET_REQUIRED = 7, |
| |
| /// The image failed to load. |
| LOAD_ERROR = Self::ERROR_BIT | 1, |
| /// A parameter was incorrect. |
| INVALID_PARAMETER = Self::ERROR_BIT | 2, |
| /// The operation is not supported. |
| UNSUPPORTED = Self::ERROR_BIT | 3, |
| /// The buffer was not the proper size for the request. |
| BAD_BUFFER_SIZE = Self::ERROR_BIT | 4, |
| /// The buffer is not large enough to hold the requested data. |
| /// The required buffer size is returned in the appropriate parameter. |
| BUFFER_TOO_SMALL = Self::ERROR_BIT | 5, |
| /// There is no data pending upon return. |
| NOT_READY = Self::ERROR_BIT | 6, |
| /// The physical device reported an error while attempting the operation. |
| DEVICE_ERROR = Self::ERROR_BIT | 7, |
| /// The device cannot be written to. |
| WRITE_PROTECTED = Self::ERROR_BIT | 8, |
| /// A resource has run out. |
| OUT_OF_RESOURCES = Self::ERROR_BIT | 9, |
| /// An inconstency was detected on the file system. |
| VOLUME_CORRUPTED = Self::ERROR_BIT | 10, |
| /// There is no more space on the file system. |
| VOLUME_FULL = Self::ERROR_BIT | 11, |
| /// The device does not contain any medium to perform the operation. |
| NO_MEDIA = Self::ERROR_BIT | 12, |
| /// The medium in the device has changed since the last access. |
| MEDIA_CHANGED = Self::ERROR_BIT | 13, |
| /// The item was not found. |
| NOT_FOUND = Self::ERROR_BIT | 14, |
| /// Access was denied. |
| ACCESS_DENIED = Self::ERROR_BIT | 15, |
| /// The server was not found or did not respond to the request. |
| NO_RESPONSE = Self::ERROR_BIT | 16, |
| /// A mapping to a device does not exist. |
| NO_MAPPING = Self::ERROR_BIT | 17, |
| /// The timeout time expired. |
| TIMEOUT = Self::ERROR_BIT | 18, |
| /// The protocol has not been started. |
| NOT_STARTED = Self::ERROR_BIT | 19, |
| /// The protocol has already been started. |
| ALREADY_STARTED = Self::ERROR_BIT | 20, |
| /// The operation was aborted. |
| ABORTED = Self::ERROR_BIT | 21, |
| /// An ICMP error occurred during the network operation. |
| ICMP_ERROR = Self::ERROR_BIT | 22, |
| /// A TFTP error occurred during the network operation. |
| TFTP_ERROR = Self::ERROR_BIT | 23, |
| /// A protocol error occurred during the network operation. |
| PROTOCOL_ERROR = Self::ERROR_BIT | 24, |
| /// The function encountered an internal version that was |
| /// incompatible with a version requested by the caller. |
| INCOMPATIBLE_VERSION = Self::ERROR_BIT | 25, |
| /// The function was not performed due to a security violation. |
| SECURITY_VIOLATION = Self::ERROR_BIT | 26, |
| /// A CRC error was detected. |
| CRC_ERROR = Self::ERROR_BIT | 27, |
| /// Beginning or end of media was reached |
| END_OF_MEDIA = Self::ERROR_BIT | 28, |
| /// The end of the file was reached. |
| END_OF_FILE = Self::ERROR_BIT | 31, |
| /// The language specified was invalid. |
| INVALID_LANGUAGE = Self::ERROR_BIT | 32, |
| /// The security status of the data is unknown or compromised and |
| /// the data must be updated or replaced to restore a valid security status. |
| COMPROMISED_DATA = Self::ERROR_BIT | 33, |
| /// There is an address conflict address allocation |
| IP_ADDRESS_CONFLICT = Self::ERROR_BIT | 34, |
| /// A HTTP error occurred during the network operation. |
| HTTP_ERROR = Self::ERROR_BIT | 35, |
| }} |
| |
| impl Status { |
| /// Bit indicating that an UEFI status code is an error. |
| pub const ERROR_BIT: usize = 1 << (core::mem::size_of::<usize>() * 8 - 1); |
| |
| /// Returns true if status code indicates success. |
| #[inline] |
| #[must_use] |
| pub fn is_success(self) -> bool { |
| self == Self::SUCCESS |
| } |
| |
| /// Returns true if status code indicates a warning. |
| #[inline] |
| #[must_use] |
| pub fn is_warning(self) -> bool { |
| (self != Self::SUCCESS) && (self.0 & Self::ERROR_BIT == 0) |
| } |
| |
| /// Returns true if the status code indicates an error. |
| #[inline] |
| #[must_use] |
| pub const fn is_error(self) -> bool { |
| self.0 & Self::ERROR_BIT != 0 |
| } |
| } |
| |
| impl core::fmt::Display for Status { |
| fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
| Debug::fmt(self, f) |
| } |
| } |