pub struct PanicHandler {
    pub custom_title: Arc<dyn PanicHandleFn<String>>,
    pub custom_body: Arc<dyn PanicHandleFn<String>>,
    pub custom_hook: Arc<dyn PanicHandleFn<()>>,
}
Expand description

Bevy plugin that opens a popup window on panic & logs an error

Fields§

§custom_title: Arc<dyn PanicHandleFn<String>>§custom_body: Arc<dyn PanicHandleFn<String>>§custom_hook: Arc<dyn PanicHandleFn<()>>

Implementations§

source§

impl PanicHandler

source

pub fn new() -> PanicHandlerBuilder

Create a new builder. The custom hook does nothing.

Examples found in repository?
examples/custom_title.rs (line 7)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(
            bevy_panic_handler::PanicHandler::new()
                .set_title_func(|info| {
                    format!(
                        "Panic at L{}:C{}",
                        info.location().unwrap().line(),
                        info.location().unwrap().column()
                    )
                })
                .build(),
        )
        .add_systems(Startup, || panic!("Example Message"))
        .run();
}
More examples
Hide additional examples
examples/closure.rs (line 10)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fn main() {
    // The path we used to run the executable
    let running_name = std::env::args().next().unwrap();

    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(
            bevy_panic_handler::PanicHandler::new()
                .set_call_func(move |_| {
                    println!("Panicked! Arg 1 was: {running_name}");
                })
                .set_body_func(|_| {
                    let mut res_str = String::new();
                    std::io::stdin().read_line(&mut res_str).unwrap();
                    format!("Panicked, also got me a message: {res_str}")
                })
                .build(),
        )
        .add_systems(Startup, || panic!("Example Error. Closures work fine too."))
        .run();
}
examples/custom_body.rs (line 7)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(
            bevy_panic_handler::PanicHandler::new()
                .set_body_func(|info| {
                    format!(
                        "Panicked at Line {}, Column {}.\nMessage:\n{}",
                        info.location().unwrap().line(),
                        info.location().unwrap().column(),
                        info.payload()
                            .downcast_ref::<String>()
                            .cloned()
                            .unwrap_or_else(|| info
                                .payload()
                                .downcast_ref::<&str>()
                                .unwrap_or(&"")
                                .to_string())
                    )
                })
                .build(),
        )
        .add_systems(Startup, || panic!("Example Message"))
        .run();
}
source

pub fn new_take_old() -> PanicHandlerBuilder

Create a new builder. The custom hook is taken from std::panic::take_hook()

Examples found in repository?
examples/popup.rs (line 6)
3
4
5
6
7
8
9
10
11
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(bevy_panic_handler::PanicHandler::new_take_old().build())
        .add_systems(Startup, || {
            panic!("Example Error.\nNewlines AOK. 😃\n{} too.", "fmt strings")
        })
        .run();
}

Trait Implementations§

source§

impl Clone for PanicHandler

source§

fn clone(&self) -> PanicHandler

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Plugin for PanicHandler

source§

fn build(&self, _: &mut App)

Configures the [App] to which this plugin is added.
§

fn ready(&self, _app: &App) -> bool

Has the plugin finished it’s setup? This can be useful for plugins that needs something asynchronous to happen before they can finish their setup, like renderer initialization. Once the plugin is ready, finish should be called.
§

fn finish(&self, _app: &mut App)

Finish adding this plugin to the [App], once all plugins registered are ready. This can be useful for plugins that depends on another plugin asynchronous setup, like the renderer.
§

fn cleanup(&self, _app: &mut App)

Runs after all plugins are built and finished, but before the app schedule is executed. This can be useful if you have some resource that other plugins need during their build step, but after build you want to remove it and send it to another thread.
§

fn name(&self) -> &str

Configures a name for the [Plugin] which is primarily used for checking plugin uniqueness and debugging.
§

fn is_unique(&self) -> bool

If the plugin can be meaningfully instantiated several times in an [App], override this method to return false.

Auto Trait Implementations§

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
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

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

§

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>,

§

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.
§

impl<T> TypeData for T
where T: 'static + Send + Sync + Clone,

§

fn clone_type_data(&self) -> Box<dyn TypeData>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<Marker, T> Plugins<Marker> for T
where T: Plugins<Marker>,