moana_std 0.1.2

moana 用户标准库
Documentation
//! syscall 相关宏定义

/// 定义 per-syscall 错误枚举
///
/// 自动生成 `from_raw`、`Display` 实现,描述信息从 `moa_uapi::error::err_msg` 获取。
///
/// ```ignore
/// define_syscall_error! {
///     pub enum RlimitError {
///         Perm = ERR_PERM,
///         NotFound = ERR_NOT_FOUND,
///     }
/// }
/// ```
macro_rules! define_syscall_error {
    (
        $(#[$enum_meta:meta])*
        $vis:vis enum $name:ident {
            $(
                $(#[$var_meta:meta])*
                $variant:ident = $code:tt
            ),*
            $(,)?
        }
    ) => {
        #[repr(isize)]
        #[derive(Clone, Copy, Debug, PartialEq, Eq)]
        $(#[$enum_meta])*
        $vis enum $name {
            $(
                $(#[$var_meta])*
                $variant = $code
            ),*
        }

        impl $name {
            /// 从原始 syscall 返回值转换
            pub fn from_raw(val: isize) -> Self {
                match val {
                    $($code => Self::$variant,)*
                    _ => unreachable!("unknown syscall error: {val}"),
                }
            }
        }

        impl core::fmt::Display for $name {
            fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
                f.write_str(moa_uapi::error::err_msg(*self as isize))
            }
        }
    };
}