blob: 57ff552dd7ab95052700f6cbeebc298e359451a5 [file] [log] [blame]
David Tolnay1e548172020-03-16 13:37:09 -07001use std::fmt::Display;
2use std::ptr;
David Tolnay1e548172020-03-16 13:37:09 -07003
David Tolnay86b17232020-03-17 01:02:15 -07004#[repr(C)]
5pub struct Error {
6 ptr: *const u8,
7 len: usize,
8}
9
10pub unsafe fn r#try<T, E>(ret: *mut T, result: Result<T, E>) -> Error
David Tolnay1e548172020-03-16 13:37:09 -070011where
12 E: Display,
13{
14 match result {
15 Ok(ok) => {
16 ptr::write(ret, ok);
David Tolnay86b17232020-03-17 01:02:15 -070017 Error {
18 ptr: ptr::null(),
19 len: 0,
20 }
David Tolnay1e548172020-03-16 13:37:09 -070021 }
David Tolnay86b17232020-03-17 01:02:15 -070022 Err(err) => to_c_string(err.to_string()),
David Tolnay1e548172020-03-16 13:37:09 -070023 }
24}
25
David Tolnay86b17232020-03-17 01:02:15 -070026unsafe fn to_c_string(msg: String) -> Error {
David Tolnay1e548172020-03-16 13:37:09 -070027 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 Tolnay86b17232020-03-17 01:02:15 -070038 Error { ptr: copy, len }
David Tolnay1e548172020-03-16 13:37:09 -070039}