| David Tolnay | 1e54817 | 2020-03-16 13:37:09 -0700 | [diff] [blame] | 1 | use std::fmt::Display; |
| 2 | use std::ptr; |
| David Tolnay | 1e54817 | 2020-03-16 13:37:09 -0700 | [diff] [blame] | 3 | |
| David Tolnay | 86b1723 | 2020-03-17 01:02:15 -0700 | [diff] [blame^] | 4 | #[repr(C)] |
| 5 | pub struct Error { |
| 6 | ptr: *const u8, |
| 7 | len: usize, |
| 8 | } |
| 9 | |
| 10 | pub unsafe fn r#try<T, E>(ret: *mut T, result: Result<T, E>) -> Error |
| David Tolnay | 1e54817 | 2020-03-16 13:37:09 -0700 | [diff] [blame] | 11 | where |
| 12 | E: Display, |
| 13 | { |
| 14 | match result { |
| 15 | Ok(ok) => { |
| 16 | ptr::write(ret, ok); |
| David Tolnay | 86b1723 | 2020-03-17 01:02:15 -0700 | [diff] [blame^] | 17 | Error { |
| 18 | ptr: ptr::null(), |
| 19 | len: 0, |
| 20 | } |
| David Tolnay | 1e54817 | 2020-03-16 13:37:09 -0700 | [diff] [blame] | 21 | } |
| David Tolnay | 86b1723 | 2020-03-17 01:02:15 -0700 | [diff] [blame^] | 22 | Err(err) => to_c_string(err.to_string()), |
| David Tolnay | 1e54817 | 2020-03-16 13:37:09 -0700 | [diff] [blame] | 23 | } |
| 24 | } |
| 25 | |
| David Tolnay | 86b1723 | 2020-03-17 01:02:15 -0700 | [diff] [blame^] | 26 | unsafe fn to_c_string(msg: String) -> Error { |
| David Tolnay | 1e54817 | 2020-03-16 13:37:09 -0700 | [diff] [blame] | 27 | let mut msg = msg; |
| 28 | msg.as_mut_vec().push(b'\0'); |
| 29 | let ptr = msg.as_ptr(); |
| 30 | let len = msg.len(); |
| 31 | |
| 32 | extern "C" { |
| 33 | #[link_name = "cxxbridge02$error"] |
| 34 | fn error(ptr: *const u8, len: usize) -> *const u8; |
| 35 | } |
| 36 | |
| 37 | let copy = error(ptr, len); |
| David Tolnay | 86b1723 | 2020-03-17 01:02:15 -0700 | [diff] [blame^] | 38 | Error { ptr: copy, len } |
| David Tolnay | 1e54817 | 2020-03-16 13:37:09 -0700 | [diff] [blame] | 39 | } |