1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
//! Module for UEFI-specific error encodings. See [`Error`].
use super::Status;
use core::fmt::{Debug, Display};
/// An UEFI-related error with optionally additional payload data. The error
/// kind is encoded in the `status` field (see [`Status`]). Additional payload
/// may be inside the `data` field.
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Error<Data: Debug = ()> {
status: Status,
data: Data,
}
impl<Data: Debug> Error<Data> {
/// Create an `Error`.
///
/// # Panics
///
/// Panics if `status` is [`Status::SUCCESS`].
pub const fn new(status: Status, data: Data) -> Self {
assert!(!matches!(status, Status::SUCCESS));
Self { status, data }
}
/// Get error `Status`.
pub const fn status(&self) -> Status {
self.status
}
/// Get error data.
pub const fn data(&self) -> &Data {
&self.data
}
/// Split this error into its inner status and error data
#[allow(clippy::missing_const_for_fn)]
pub fn split(self) -> (Status, Data) {
(self.status, self.data)
}
}
// Errors without error data can be autogenerated from statuses
impl From<Status> for Error<()> {
fn from(status: Status) -> Self {
Error::new(status, ())
}
}
impl<Data: Debug> Display for Error<Data> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "UEFI Error {}: {:?}", self.status(), self.data())
}
}
impl<Data: Debug> Error<Data> {
/// Transforms the generic payload of an error to `()`. This is useful if
/// you want
/// - to retain the erroneous status code,
/// - do not care about the payload, and
/// - refrain from generic type complexity in a higher API level.
pub fn to_err_without_payload(&self) -> Error<()> {
Error {
status: self.status,
data: (),
}
}
}
#[cfg(feature = "unstable")]
impl<Data: Debug> core::error::Error for Error<Data> {}