Skip to main content

CatchAssertUnwindSafe

Struct CatchAssertUnwindSafe 

Source
pub struct CatchAssertUnwindSafe<H> { /* private fields */ }
Expand description

Panic-catching wrapper for Handler implementations.

Catches panics during run() so the handler is never lost during move-out-fire dispatch. This is an annotation — wrap a concrete handler, then virtualize through your chosen storage (Box, Flat, Flex, typed slab, etc.).

By constructing this wrapper, the user asserts that the inner handler (and any World resources it mutates) can tolerate partial writes caused by an unwound run() call. This is the same assertion as std::panic::AssertUnwindSafe, applied at the handler level.

§Examples

use nexus_rt::{CatchAssertUnwindSafe, WorldBuilder, ResMut, IntoHandler, Handler, Virtual};

fn tick(mut counter: ResMut<u64>, event: u32) {
    *counter += event as u64;
}

let mut builder = WorldBuilder::new();
builder.register::<u64>(0);
let mut world = builder.build();

let handler = tick.into_handler(world.registry());
let guarded = CatchAssertUnwindSafe::new(handler);
let mut boxed: Virtual<u32> = Box::new(guarded);

boxed.run(&mut world, 10);
assert_eq!(*world.resource::<u64>(), 10);

Implementations§

Source§

impl<H> CatchAssertUnwindSafe<H>

Source

pub fn new(handler: H) -> Self

Wrap a handler with panic catching.

The caller asserts that the handler and any resources it touches are safe to continue using after a caught panic.

Trait Implementations§

Source§

impl<E, H: Handler<E>> Handler<E> for CatchAssertUnwindSafe<H>

Source§

fn run(&mut self, world: &mut World, event: E)

Run this handler with the given event.
Source§

fn name(&self) -> &'static str

Returns the handler’s name. Read more

Auto Trait Implementations§

§

impl<H> Freeze for CatchAssertUnwindSafe<H>
where H: Freeze,

§

impl<H> RefUnwindSafe for CatchAssertUnwindSafe<H>
where H: RefUnwindSafe,

§

impl<H> Send for CatchAssertUnwindSafe<H>
where H: Send,

§

impl<H> Sync for CatchAssertUnwindSafe<H>
where H: Sync,

§

impl<H> Unpin for CatchAssertUnwindSafe<H>
where H: Unpin,

§

impl<H> UnsafeUnpin for CatchAssertUnwindSafe<H>
where H: UnsafeUnpin,

§

impl<H> UnwindSafe for CatchAssertUnwindSafe<H>
where H: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.