Struct magnus::error::OpaqueError
source · pub struct OpaqueError(/* private fields */);
Expand description
A wrapper to make a Error
Send
+ Sync
.
Error
is not Send
or Sync
as it provides a way to call some of
Ruby’s APIs, which are not safe to call from a non-Ruby thread.
Error
is safe to send between Ruby threads, but Rust’s trait system
currently can not model this detail.
To resolve this, the OpaqueError
type makes an Error
Send
+
Sync
by removing the ability use it with any Ruby APIs.
OpaqueError::into_error_with
provides a way to safely get an Error
from a OpaqueError
].
Note that OpaqueError
contains a Ruby value, so must be kept on the stack
of a Ruby thread to prevent it from being Garbage Collected (or otherwise
protected from premature GC).
Implementations§
source§impl OpaqueError
impl OpaqueError
sourcepub fn into_error_with(this: Self, handle: &Ruby) -> Error
pub fn into_error_with(this: Self, handle: &Ruby) -> Error
Convert an OpaqueError
into an Error
.
§Examples
use magnus::{error::OpaqueError, Error, Ruby};
let ruby = Ruby::get().unwrap(); // errors on non-Ruby thread
let opaque_err = OpaqueError::from(Error::new(ruby.exception_runtime_error(), "test"));
// send to another Ruby thread
let ruby = Ruby::get().unwrap(); // errors on non-Ruby thread
let err = OpaqueError::into_error_with(opaque_err, &ruby);
assert!(err.is_kind_of(ruby.exception_runtime_error()));
Trait Implementations§
source§impl From<Error> for OpaqueError
impl From<Error> for OpaqueError
impl Send for OpaqueError
impl Sync for OpaqueError
Auto Trait Implementations§
impl Freeze for OpaqueError
impl RefUnwindSafe for OpaqueError
impl Unpin for OpaqueError
impl UnwindSafe for OpaqueError
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more