use std::panic;
use bevy::{app::AppExit, prelude::*};
use color_eyre::{
self,
config::{EyreHook, HookBuilder, PanicHook},
eyre,
};
use crate::terminal::RatatuiContext;
pub struct ErrorPlugin;
impl Plugin for ErrorPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Startup, setup);
}
}
pub fn setup() -> Result {
let (panic_hook, eyre_hook) = HookBuilder::default().into_hooks();
set_panic_hook(panic_hook);
set_error_hook(eyre_hook)?;
Ok(())
}
fn set_panic_hook(panic_hook: PanicHook) {
let panic_hook = panic_hook.into_panic_hook();
panic::set_hook(Box::new(move |panic_info| {
let _ = RatatuiContext::restore();
panic_hook(panic_info);
}));
}
fn set_error_hook(eyre_hook: EyreHook) -> Result {
let eyre_hook = eyre_hook.into_eyre_hook();
eyre::set_hook(Box::new(move |error| {
let _ = RatatuiContext::restore();
eyre_hook(error)
}))?;
Ok(())
}
#[deprecated(
since = "0.8.0",
note = "bevy now allows returning the catch-all `bevy::prelude::Result` from systems, so piping is no longer necessary"
)]
pub fn exit_on_error(In(result): In<Result<()>>, mut app_exit: EventWriter<AppExit>) {
if let Err(err) = result {
tracing::error!("Error: {:?}", err);
app_exit.write_default();
}
}