]> git.sesse.net Git - bcachefs-tools-debian/blob - rust-src/bch_bindgen/src/errcode.rs
New upstream release
[bcachefs-tools-debian] / rust-src / bch_bindgen / src / errcode.rs
1 use crate::bcachefs;
2 use std::ffi::CStr;
3 use std::fmt;
4
5 pub use crate::c::bch_errcode;
6
7 impl fmt::Display for bch_errcode {
8     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9         let s = unsafe { CStr::from_ptr(bcachefs::bch2_err_str(*self as i32)) };
10         write!(f, "{:?}", s)
11     }
12 }
13
14 /* Can we make a function generic over ptr constness? */
15
16 pub fn errptr_to_result<T>(p: *mut T) -> Result<*mut T, bch_errcode> {
17     let addr = p as usize;
18     let max_err: isize = -4096;
19     if addr > max_err as usize {
20         let addr = addr as i32;
21         let err: bch_errcode = unsafe { std::mem::transmute(-addr) };
22         Err(err)
23     } else {
24         Ok(p)
25     }
26 }
27
28 pub fn errptr_to_result_c<T>(p: *const T) -> Result<*const T, bch_errcode> {
29     let addr = p as usize;
30     let max_err: isize = -4096;
31     if addr > max_err as usize {
32         let addr = addr as i32;
33         let err: bch_errcode = unsafe { std::mem::transmute(-addr) };
34         Err(err)
35     } else {
36         Ok(p)
37     }
38 }
39
40 impl std::error::Error for bch_errcode {}