sel4/
error.rs

1//
2// Copyright 2023, Colias Group, LLC
3// Copyright (c) 2020 Arm Limited
4//
5// SPDX-License-Identifier: MIT
6//
7
8use core::{fmt, result};
9
10use crate::sys;
11
12/// Alias for `Result<_, Error>`.
13pub type Result<T> = result::Result<T, Error>;
14
15/// Corresponds to `seL4_Error`.
16#[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);