Remove thiserror from bevy_ecs (#15774)

# Objective

- Contributes to #15460

## Solution

- Removed `thiserror` from `bevy_ecs`
This commit is contained in:
Zachary Harrold 2024-10-10 01:20:58 +11:00 committed by GitHub
parent 4c76ea7a5a
commit 0a61f04d9b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 94 additions and 90 deletions

View file

@ -32,7 +32,13 @@ concurrent-queue = "2.4.0"
disqualified = "1.0"
fixedbitset = "0.5"
serde = { version = "1", optional = true, default-features = false }
thiserror = "1.0"
derive_more = { version = "1", default-features = false, features = [
"error",
"from",
"display",
"into",
"as_ref",
] }
nonmax = "0.5"
arrayvec = { version = "0.7.4", optional = true }
smallvec = "1"

View file

@ -27,7 +27,7 @@ use core::{
marker::PhantomData,
mem::needs_drop,
};
use thiserror::Error;
use derive_more::derive::{Display, Error};
/// A data type that can be used to store data for an [entity].
///
@ -1623,14 +1623,18 @@ impl<T: Component> FromWorld for InitComponentId<T> {
}
/// An error returned when the registration of a required component fails.
#[derive(Error, Debug)]
#[derive(Error, Display, Debug)]
#[non_exhaustive]
pub enum RequiredComponentsError {
/// The component is already a directly required component for the requiree.
#[error("Component {0:?} already directly requires component {1:?}")]
#[display("Component {0:?} already directly requires component {_1:?}")]
#[error(ignore)]
DuplicateRegistration(ComponentId, ComponentId),
/// An archetype with the component that requires other components already exists
#[error("An archetype with the component {0:?} that requires other components already exists")]
#[display(
"An archetype with the component {_0:?} that requires other components already exists"
)]
#[error(ignore)]
ArchetypeExists(ComponentId),
}

View file

@ -2,6 +2,7 @@ use crate::component::ComponentId;
use crate::storage::SparseSetIndex;
use crate::world::World;
use core::{fmt, fmt::Debug, marker::PhantomData};
use derive_more::derive::From;
use fixedbitset::FixedBitSet;
/// A wrapper struct to make Debug representations of [`FixedBitSet`] easier
@ -856,7 +857,7 @@ impl<T: SparseSetIndex> From<FilteredAccess<T>> for FilteredAccessSet<T> {
}
/// Records how two accesses conflict with each other
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, From)]
pub enum AccessConflicts {
/// Conflict is for all indices
All,
@ -908,12 +909,6 @@ impl AccessConflicts {
}
}
impl From<FixedBitSet> for AccessConflicts {
fn from(value: FixedBitSet) -> Self {
Self::Individual(value)
}
}
impl<T: SparseSetIndex> From<Vec<T>> for AccessConflicts {
fn from(value: Vec<T>) -> Self {
Self::Individual(value.iter().map(T::sparse_set_index).collect())

View file

@ -1,4 +1,4 @@
use thiserror::Error;
use derive_more::derive::{Display, Error};
use crate::{entity::Entity, world::unsafe_world_cell::UnsafeWorldCell};
@ -90,13 +90,15 @@ impl<'w> Eq for QueryEntityError<'w> {}
/// An error that occurs when evaluating a [`Query`](crate::system::Query) or [`QueryState`](crate::query::QueryState) as a single expected result via
/// [`get_single`](crate::system::Query::get_single) or [`get_single_mut`](crate::system::Query::get_single_mut).
#[derive(Debug, Error)]
#[derive(Debug, Error, Display)]
pub enum QuerySingleError {
/// No entity fits the query.
#[error("No entities fit the query {0}")]
#[display("No entities fit the query {_0}")]
#[error(ignore)]
NoEntities(&'static str),
/// Multiple entities fit the query.
#[error("Multiple entities fit the query {0}")]
#[display("Multiple entities fit the query {_0}")]
#[error(ignore)]
MultipleEntities(&'static str),
}

View file

@ -11,6 +11,8 @@ use crate::{
world::{unsafe_world_cell::UnsafeWorldCell, World},
};
use derive_more::derive::Into;
use core::{
fmt::Debug,
iter,
@ -21,15 +23,9 @@ use core::{
/// Wrapper around [`Entity`] for [`RemovedComponents`].
/// Internally, `RemovedComponents` uses these as an `Events<RemovedComponentEntity>`.
#[derive(Event, Debug, Clone)]
#[derive(Event, Debug, Clone, Into)]
pub struct RemovedComponentEntity(Entity);
impl From<RemovedComponentEntity> for Entity {
fn from(value: RemovedComponentEntity) -> Self {
value.0
}
}
/// Wrapper around a [`EventCursor<RemovedComponentEntity>`] so that we
/// can differentiate events between components.
#[derive(Debug)]

View file

@ -8,10 +8,10 @@ use bevy_utils::{
tracing::{error, info, warn},
HashMap, HashSet,
};
use derive_more::derive::{Display, Error};
use disqualified::ShortName;
use fixedbitset::FixedBitSet;
use petgraph::{algo::TarjanScc, prelude::*};
use thiserror::Error;
use crate::{
self as bevy_ecs,
@ -1934,42 +1934,43 @@ impl ScheduleGraph {
}
/// Category of errors encountered during schedule construction.
#[derive(Error, Debug)]
#[derive(Error, Display, Debug)]
#[error(ignore)]
#[non_exhaustive]
pub enum ScheduleBuildError {
/// A system set contains itself.
#[error("System set `{0}` contains itself.")]
#[display("System set `{_0}` contains itself.")]
HierarchyLoop(String),
/// The hierarchy of system sets contains a cycle.
#[error("System set hierarchy contains cycle(s).\n{0}")]
#[display("System set hierarchy contains cycle(s).\n{_0}")]
HierarchyCycle(String),
/// The hierarchy of system sets contains redundant edges.
///
/// This error is disabled by default, but can be opted-in using [`ScheduleBuildSettings`].
#[error("System set hierarchy contains redundant edges.\n{0}")]
#[display("System set hierarchy contains redundant edges.\n{_0}")]
HierarchyRedundancy(String),
/// A system (set) has been told to run before itself.
#[error("System set `{0}` depends on itself.")]
#[display("System set `{_0}` depends on itself.")]
DependencyLoop(String),
/// The dependency graph contains a cycle.
#[error("System dependencies contain cycle(s).\n{0}")]
#[display("System dependencies contain cycle(s).\n{_0}")]
DependencyCycle(String),
/// Tried to order a system (set) relative to a system set it belongs to.
#[error("`{0}` and `{1}` have both `in_set` and `before`-`after` relationships (these might be transitive). This combination is unsolvable as a system cannot run before or after a set it belongs to.")]
#[display("`{0}` and `{_1}` have both `in_set` and `before`-`after` relationships (these might be transitive). This combination is unsolvable as a system cannot run before or after a set it belongs to.")]
CrossDependency(String, String),
/// Tried to order system sets that share systems.
#[error("`{0}` and `{1}` have a `before`-`after` relationship (which may be transitive) but share systems.")]
#[display("`{0}` and `{_1}` have a `before`-`after` relationship (which may be transitive) but share systems.")]
SetsHaveOrderButIntersect(String, String),
/// Tried to order a system (set) relative to all instances of some system function.
#[error("Tried to order against `{0}` in a schedule that has more than one `{0}` instance. `{0}` is a `SystemTypeSet` and cannot be used for ordering if ambiguous. Use a different set without this restriction.")]
#[display("Tried to order against `{0}` in a schedule that has more than one `{0}` instance. `{_0}` is a `SystemTypeSet` and cannot be used for ordering if ambiguous. Use a different set without this restriction.")]
SystemTypeSetAmbiguity(String),
/// Systems with conflicting access have indeterminate run order.
///
/// This error is disabled by default, but can be opted-in using [`ScheduleBuildSettings`].
#[error("Systems with conflicting access have indeterminate run order.\n{0}")]
#[display("Systems with conflicting access have indeterminate run order.\n{_0}")]
Ambiguity(String),
/// Tried to run a schedule before all of its systems have been initialized.
#[error("Systems in schedule have not been initialized.")]
#[display("Systems in schedule have not been initialized.")]
Uninitialized,
}
@ -2040,8 +2041,8 @@ impl ScheduleBuildSettings {
/// Error to denote that [`Schedule::initialize`] or [`Schedule::run`] has not yet been called for
/// this schedule.
#[derive(Error, Debug)]
#[error("executable schedule has not been built")]
#[derive(Error, Display, Debug)]
#[display("executable schedule has not been built")]
pub struct ScheduleNotInitialized;
#[cfg(test)]

View file

@ -7,10 +7,13 @@ use crate::{
system::{IntoSystem, ResMut, Resource},
};
use bevy_utils::{
tracing::{error, info, warn},
tracing::{info, warn},
TypeIdMap,
};
use thiserror::Error;
use derive_more::derive::{Display, Error};
#[cfg(not(feature = "bevy_debug_stepping"))]
use bevy_utils::tracing::error;
#[cfg(test)]
use bevy_utils::tracing::debug;
@ -87,8 +90,8 @@ enum Update {
ClearBehavior(InternedScheduleLabel, SystemIdentifier),
}
#[derive(Error, Debug)]
#[error("not available until all configured schedules have been run; try again next frame")]
#[derive(Error, Display, Debug)]
#[display("not available until all configured schedules have been run; try again next frame")]
pub struct NotReady;
#[derive(Resource, Default)]

View file

@ -1,6 +1,6 @@
use bevy_utils::tracing::warn;
use core::fmt::Debug;
use thiserror::Error;
use derive_more::derive::{Display, Error};
use crate::{
archetype::ArchetypeComponentId,
@ -357,12 +357,13 @@ impl RunSystemOnce for &mut World {
}
/// Running system failed.
#[derive(Error)]
#[derive(Error, Display)]
pub enum RunSystemError {
/// System could not be run due to parameters that failed validation.
///
/// This can occur because the data required by the system was not present in the world.
#[error("The data required by the system {0:?} was not found in the world and the system did not run due to failed parameter validation.")]
#[display("The data required by the system {_0:?} was not found in the world and the system did not run due to failed parameter validation.")]
#[error(ignore)]
InvalidParams(Cow<'static, str>),
}

View file

@ -6,6 +6,7 @@ use crate::{
};
use alloc::borrow::Cow;
use core::ops::Deref;
use derive_more::derive::{AsRef, Display, Into};
/// [`SystemParam`] that returns the name of the system which it is used in.
///
@ -33,7 +34,8 @@ use core::ops::Deref;
/// logger.log("Hello");
/// }
/// ```
#[derive(Debug)]
#[derive(Debug, Into, Display, AsRef)]
#[as_ref(str)]
pub struct SystemName<'s>(&'s str);
impl<'s> SystemName<'s> {
@ -50,25 +52,6 @@ impl<'s> Deref for SystemName<'s> {
}
}
impl<'s> AsRef<str> for SystemName<'s> {
fn as_ref(&self) -> &str {
self.name()
}
}
impl<'s> From<SystemName<'s>> for &'s str {
fn from(name: SystemName<'s>) -> &'s str {
name.0
}
}
impl<'s> core::fmt::Display for SystemName<'s> {
#[inline(always)]
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
core::fmt::Display::fmt(&self.name(), f)
}
}
// SAFETY: no component value access
unsafe impl SystemParam for SystemName<'_> {
type State = Cow<'static, str>;

View file

@ -12,7 +12,7 @@ use bevy_ecs_macros::{Component, Resource};
#[cfg(feature = "bevy_reflect")]
use bevy_reflect::Reflect;
use core::marker::PhantomData;
use thiserror::Error;
use derive_more::derive::{Display, Error};
/// A small wrapper for [`BoxedSystem`] that also keeps track whether or not the system has been initialized.
#[derive(Component)]
@ -587,28 +587,28 @@ where
}
/// An operation with stored systems failed.
#[derive(Error)]
#[derive(Error, Display)]
pub enum RegisteredSystemError<I: SystemInput = (), O = ()> {
/// A system was run by id, but no system with that id was found.
///
/// Did you forget to register it?
#[error("System {0:?} was not registered")]
#[display("System {_0:?} was not registered")]
SystemIdNotRegistered(SystemId<I, O>),
/// A cached system was removed by value, but no system with its type was found.
///
/// Did you forget to register it?
#[error("Cached system was not found")]
#[display("Cached system was not found")]
SystemNotCached,
/// A system tried to run itself recursively.
#[error("System {0:?} tried to run itself recursively")]
#[display("System {_0:?} tried to run itself recursively")]
Recursive(SystemId<I, O>),
/// A system tried to remove itself.
#[error("System {0:?} tried to remove itself")]
#[display("System {_0:?} tried to remove itself")]
SelfRemove(SystemId<I, O>),
/// System could not be run due to parameters that failed validation.
///
/// This can occur because the data required by the system was not present in the world.
#[error("The data required by the system {0:?} was not found in the world and the system did not run due to failed parameter validation.")]
#[display("The data required by the system {_0:?} was not found in the world and the system did not run due to failed parameter validation.")]
InvalidParams(SystemId<I, O>),
}

View file

@ -15,7 +15,7 @@ use crate::{
use bevy_ptr::{OwningPtr, Ptr};
use bevy_utils::{HashMap, HashSet};
use core::{any::TypeId, marker::PhantomData, mem::MaybeUninit};
use thiserror::Error;
use derive_more::derive::{Display, Error};
use super::{unsafe_world_cell::UnsafeEntityCell, Ref, ON_REMOVE, ON_REPLACE};
@ -2774,12 +2774,16 @@ impl<'a> From<&'a mut EntityWorldMut<'_>> for FilteredEntityMut<'a> {
}
}
#[derive(Error, Debug)]
#[derive(Error, Display, Debug)]
pub enum TryFromFilteredError {
#[error("Conversion failed, filtered entity ref does not have read access to all components")]
#[display(
"Conversion failed, filtered entity ref does not have read access to all components"
)]
MissingReadAllAccess,
#[error("Conversion failed, filtered entity ref does not have write access to all components")]
#[display(
"Conversion failed, filtered entity ref does not have write access to all components"
)]
MissingWriteAllAccess,
}

View file

@ -1,34 +1,39 @@
//! Contains error types returned by bevy's schedule.
use thiserror::Error;
use derive_more::derive::{Display, Error};
use crate::{component::ComponentId, entity::Entity, schedule::InternedScheduleLabel};
/// The error type returned by [`World::try_run_schedule`] if the provided schedule does not exist.
///
/// [`World::try_run_schedule`]: crate::world::World::try_run_schedule
#[derive(Error, Debug)]
#[error("The schedule with the label {0:?} was not found.")]
#[derive(Error, Display, Debug)]
#[display("The schedule with the label {_0:?} was not found.")]
#[error(ignore)]
pub struct TryRunScheduleError(pub InternedScheduleLabel);
/// An error that occurs when dynamically retrieving components from an entity.
#[derive(Error, Debug, Clone, Copy, PartialEq, Eq)]
#[derive(Error, Display, Debug, Clone, Copy, PartialEq, Eq)]
pub enum EntityComponentError {
/// The component with the given [`ComponentId`] does not exist on the entity.
#[error("The component with ID {0:?} does not exist on the entity.")]
#[display("The component with ID {_0:?} does not exist on the entity.")]
#[error(ignore)]
MissingComponent(ComponentId),
/// The component with the given [`ComponentId`] was requested mutably more than once.
#[error("The component with ID {0:?} was requested mutably more than once.")]
#[display("The component with ID {_0:?} was requested mutably more than once.")]
#[error(ignore)]
AliasedMutability(ComponentId),
}
/// An error that occurs when fetching entities mutably from a world.
#[derive(Error, Debug, Clone, Copy, PartialEq, Eq)]
#[derive(Error, Display, Debug, Clone, Copy, PartialEq, Eq)]
pub enum EntityFetchError {
/// The entity with the given ID does not exist.
#[error("The entity with ID {0:?} does not exist.")]
#[display("The entity with ID {_0:?} does not exist.")]
#[error(ignore)]
NoSuchEntity(Entity),
/// The entity with the given ID was requested mutably more than once.
#[error("The entity with ID {0:?} was requested mutably more than once.")]
#[display("The entity with ID {_0:?} was requested mutably more than once.")]
#[error(ignore)]
AliasedMutability(Entity),
}

View file

@ -2,7 +2,7 @@
use core::any::TypeId;
use thiserror::Error;
use derive_more::derive::{Display, Error};
use bevy_reflect::{Reflect, ReflectFromPtr};
@ -198,7 +198,7 @@ impl World {
}
/// The error type returned by [`World::get_reflect`] and [`World::get_reflect_mut`].
#[derive(Error, Debug)]
#[derive(Error, Display, Debug)]
pub enum GetComponentReflectError {
/// There is no [`ComponentId`] corresponding to the given [`TypeId`].
///
@ -208,11 +208,14 @@ pub enum GetComponentReflectError {
/// See the documentation for [`bevy_reflect`] for more information.
///
/// [`App::register_type`]: ../../../bevy_app/struct.App.html#method.register_type
#[error("No `ComponentId` corresponding to {0:?} found (did you call App::register_type()?)")]
#[display(
"No `ComponentId` corresponding to {_0:?} found (did you call App::register_type()?)"
)]
#[error(ignore)]
NoCorrespondingComponentId(TypeId),
/// The given [`Entity`] does not have a [`Component`] corresponding to the given [`TypeId`].
#[error("The given `Entity` {entity:?} does not have a `{component_name:?}` component ({component_id:?}, which corresponds to {type_id:?})")]
#[display("The given `Entity` {entity:?} does not have a `{component_name:?}` component ({component_id:?}, which corresponds to {type_id:?})")]
EntityDoesNotHaveComponent {
/// The given [`Entity`].
entity: Entity,
@ -226,7 +229,7 @@ pub enum GetComponentReflectError {
},
/// The [`World`] was missing the [`AppTypeRegistry`] resource.
#[error("The `World` was missing the `AppTypeRegistry` resource")]
#[display("The `World` was missing the `AppTypeRegistry` resource")]
MissingAppTypeRegistry,
/// The [`World`]'s [`TypeRegistry`] did not contain [`TypeData`] for [`ReflectFromPtr`] for the given [`TypeId`].
@ -240,7 +243,8 @@ pub enum GetComponentReflectError {
/// [`TypeRegistry`]: bevy_reflect::TypeRegistry
/// [`ReflectFromPtr`]: bevy_reflect::ReflectFromPtr
/// [`App::register_type`]: ../../../bevy_app/struct.App.html#method.register_type
#[error("The `World`'s `TypeRegistry` did not contain `TypeData` for `ReflectFromPtr` for the given {0:?} (did you call `App::register_type()`?)")]
#[display("The `World`'s `TypeRegistry` did not contain `TypeData` for `ReflectFromPtr` for the given {_0:?} (did you call `App::register_type()`?)")]
#[error(ignore)]
MissingReflectFromPtrTypeData(TypeId),
}