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, Resource};

#[derive(Resource)]
struct Counter(u64);

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

let mut builder = WorldBuilder::new();
builder.register(Counter(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::<Counter>().0, 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.

Source

pub fn panic_count(&self) -> u64

Number of panics caught since construction.

Poll this periodically in health checks to detect handlers that are silently failing. A non-zero value means the handler panicked at least once — investigate the root cause.

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<E, H> IntoHandler<E, Resolved> for H
where H: Handler<E> + 'static,

Source§

type Handler = H

The concrete handler type produced.
Source§

fn into_handler(self, _registry: &Registry) -> H

Convert this function into a handler, resolving parameters from the registry.
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.