1use core::{fmt, result};
9
10use crate::sys;
11
12pub type Result<T> = result::Result<T, Error>;
14
15#[repr(u32)]
17#[derive(Debug, Clone, Copy, Eq, PartialEq)]
18pub enum Error {
19 InvalidArgument = sys::seL4_Error::seL4_InvalidArgument,
20 InvalidCapability = sys::seL4_Error::seL4_InvalidCapability,
21 IllegalOperation = sys::seL4_Error::seL4_IllegalOperation,
22 RangeError = sys::seL4_Error::seL4_RangeError,
23 AlignmentError = sys::seL4_Error::seL4_AlignmentError,
24 FailedLookup = sys::seL4_Error::seL4_FailedLookup,
25 TruncatedMessage = sys::seL4_Error::seL4_TruncatedMessage,
26 DeleteFirst = sys::seL4_Error::seL4_DeleteFirst,
27 RevokeFirst = sys::seL4_Error::seL4_RevokeFirst,
28 NotEnoughMemory = sys::seL4_Error::seL4_NotEnoughMemory,
29}
30
31impl fmt::Display for Error {
32 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
33 write!(f, "seL4_Error: {self:?}")
34 }
35}
36
37impl Error {
38 pub const fn into_sys(self) -> sys::seL4_Error::Type {
39 self as sys::seL4_Error::Type
40 }
41
42 pub fn from_sys(err: sys::seL4_Error::Type) -> Option<Self> {
43 match err {
44 sys::seL4_Error::seL4_NoError => None,
45 sys::seL4_Error::seL4_InvalidArgument => Some(Self::InvalidArgument),
46 sys::seL4_Error::seL4_InvalidCapability => Some(Self::InvalidCapability),
47 sys::seL4_Error::seL4_IllegalOperation => Some(Self::IllegalOperation),
48 sys::seL4_Error::seL4_RangeError => Some(Self::RangeError),
49 sys::seL4_Error::seL4_AlignmentError => Some(Self::AlignmentError),
50 sys::seL4_Error::seL4_FailedLookup => Some(Self::FailedLookup),
51 sys::seL4_Error::seL4_TruncatedMessage => Some(Self::TruncatedMessage),
52 sys::seL4_Error::seL4_DeleteFirst => Some(Self::DeleteFirst),
53 sys::seL4_Error::seL4_RevokeFirst => Some(Self::RevokeFirst),
54 sys::seL4_Error::seL4_NotEnoughMemory => Some(Self::NotEnoughMemory),
55 _ => panic!("invalid seL4_Error: {}", err),
56 }
57 }
58
59 pub(crate) fn wrap(err: sys::seL4_Error::Type) -> Result<()> {
60 Self::or(err, ())
61 }
62
63 pub(crate) fn or<T>(err: sys::seL4_Error::Type, value: T) -> Result<T> {
64 match Self::from_sys(err) {
65 None => Ok(value),
66 Some(err) => Err(err),
67 }
68 }
69}
70
71#[allow(clippy::assertions_on_constants)]
72const _: () = assert!(sys::seL4_Error::seL4_NumErrors == 11);