use bevy_ecs::prelude::{Entity, Resource};
use backtrace::Backtrace;
use anyhow::Error as Anyhow;
use std::{borrow::Cow, sync::Arc};
use crate::{Broken, Cancel, Disposal, OperationError};
use thiserror::Error as ThisError;
#[derive(Resource, Default, Clone, Debug)]
pub struct UnhandledErrors {
pub setup: Vec<SetupFailure>,
pub cancellations: Vec<CancelFailure>,
pub operations: Vec<OperationError>,
pub disposals: Vec<DisposalFailure>,
pub stop_tasks: Vec<StopTaskFailure>,
pub broken: Vec<Broken>,
pub unused_targets: Vec<UnusedTargetDrop>,
pub connections: Vec<ConnectionFailure>,
pub duplicate_streams: Vec<DuplicateStream>,
pub flush_warnings: Vec<FlushWarning>,
pub miscellaneous: Vec<MiscellaneousFailure>,
}
impl UnhandledErrors {
pub fn is_empty(&self) -> bool {
self.setup.is_empty()
&& self.cancellations.is_empty()
&& self.operations.is_empty()
&& self.disposals.is_empty()
&& self.stop_tasks.is_empty()
&& self.broken.is_empty()
&& self.unused_targets.is_empty()
&& self.connections.is_empty()
&& self.duplicate_streams.is_empty()
&& self.flush_warnings.is_empty()
&& self.miscellaneous.is_empty()
}
}
#[derive(Clone, Debug)]
pub struct SetupFailure {
pub broken_node: Entity,
pub error: OperationError,
}
#[derive(Clone, Debug)]
pub struct CancelFailure {
pub error: OperationError,
pub cancel: Cancel,
}
impl CancelFailure {
pub fn new(error: OperationError, cancel: Cancel) -> Self {
Self { error, cancel }
}
}
#[derive(Clone, Debug)]
pub struct DisposalFailure {
pub disposal: Disposal,
pub broken_node: Entity,
pub backtrace: Option<Backtrace>,
}
#[derive(Clone, Debug)]
pub struct StopTaskFailure {
pub task: Entity,
pub backtrace: Option<Backtrace>,
}
#[derive(Clone, Debug)]
pub struct UnusedTargetDrop {
pub unused_target: Entity,
pub dropped_series: Vec<Entity>,
}
#[derive(Clone, Debug)]
pub struct ConnectionFailure {
pub original_target: Entity,
pub new_target: Entity,
pub backtrace: Backtrace,
}
#[derive(Clone, Debug)]
pub struct MiscellaneousFailure {
pub error: Arc<Anyhow>,
pub backtrace: Option<Backtrace>,
}
#[derive(Clone, Debug)]
pub struct DuplicateStream {
pub target: Entity,
pub type_name: &'static str,
pub stream_name: Option<Cow<'static, str>>,
}
#[derive(Clone, Debug, ThisError)]
pub enum FlushWarning {
#[error("exceeded flush loop limit of {limit} with {reached}")]
ExceededFlushLoopLimit { limit: usize, reached: usize },
#[error(
"exceeded poll limit {limit} with {reached} while performing single-threaded execution"
)]
ExceededSingleThreadedPollLimit { limit: usize, reached: usize },
#[error("exceeded channel received limit of {limit} with {reached}")]
ExceededChannelReceivedLimit { limit: usize, reached: usize },
}