in uniffi_core/src/ffi/rustcalls.rs [230:280]
fn test_rust_call() {
// Successful call
let mut status = RustCallStatus::default();
let return_value = rust_call(&mut status, || {
<Result<i8, TestError> as LowerReturn<UniFfiTag>>::lower_return(Ok(100))
});
assert_eq!(status.code, RustCallStatusCode::Success);
assert_eq!(return_value, 100);
// Successful call that returns an Err value
let mut status = RustCallStatus::default();
rust_call(&mut status, || {
<Result<i8, TestError> as LowerReturn<UniFfiTag>>::lower_return(Err(TestError(
"Error".into(),
)))
});
assert_eq!(status.code, RustCallStatusCode::Error);
assert_eq!(
<TestError as Lift<UniFfiTag>>::try_lift(ManuallyDrop::into_inner(status.error_buf))
.unwrap(),
TestError("Error".to_owned())
);
// Internal error while trying to make the call
let mut status = RustCallStatus::default();
rust_call(&mut status, || {
<Result<i8, TestError> as LowerReturn<UniFfiTag>>::handle_failed_lift(LiftArgsError {
arg_name: "foo",
error: anyhow!("invalid handle"),
})
});
assert_eq!(status.code, RustCallStatusCode::UnexpectedError);
assert_eq!(
<String as Lift<UniFfiTag>>::try_lift(ManuallyDrop::into_inner(status.error_buf))
.unwrap(),
"Failed to convert arg 'foo': invalid handle"
);
// Panic inside the call
let mut status = RustCallStatus::default();
rust_call(&mut status, || -> Result<i8, RustCallError> {
panic!("I crashed")
});
assert_eq!(status.code, RustCallStatusCode::UnexpectedError);
assert_eq!(
<String as Lift<UniFfiTag>>::try_lift(ManuallyDrop::into_inner(status.error_buf))
.unwrap(),
"I crashed"
);
}