1use crate::exn::{LibraryExn, syscall_exn, syscall_throw};
2use crate::sys::{SysErr, SyscallNo};
3
4pub trait ReThrow {
6 #[cfg_attr(not(target_arch = "riscv32"), track_caller)]
9 fn re_throw(self) -> !;
10}
11
12pub trait OrReThrow<T> {
14 fn or_re_throw(self) -> T;
16}
17
18impl<T, E: ReThrow> OrReThrow<T> for Result<T, E> {
19 #[cfg_attr(not(target_arch = "riscv32"), track_caller)]
20 fn or_re_throw(self) -> T {
21 match self {
22 Ok(v) => v,
23 Err(e) => e.re_throw(),
24 }
25 }
26}
27
28impl ReThrow for core::convert::Infallible {
29 #[cfg_attr(not(target_arch = "riscv32"), track_caller)]
30 fn re_throw(self) -> ! {
31 match self {}
32 }
33}
34
35pub trait OrSyscallThrow<T> {
40 fn or_syscall_throw(self, callno: SyscallNo) -> T;
43
44 fn or_syscall_exn(self, callno: SyscallNo) -> Result<T, LibraryExn>;
48}
49
50impl<T> OrSyscallThrow<T> for Result<T, SysErr> {
51 #[cfg_attr(not(target_arch = "riscv32"), track_caller)]
54 fn or_syscall_throw(self, callno: SyscallNo) -> T {
55 match self {
56 Ok(v) => v,
57 Err(errno) => syscall_throw(callno, errno),
58 }
59 }
60
61 fn or_syscall_exn(self, callno: SyscallNo) -> Result<T, LibraryExn> {
62 self.map_err(|errno| syscall_exn(callno, errno))
63 }
64}