clean up configure_set(s) erroring (#9577)
# Objective
- have errors in configure_set and configure_sets show the line number
of the user calling location rather than pointing to schedule.rs
- use display formatting for the errors
## Example Error Text
```text
// dependency loop
// before
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: DependencyLoop("A")', crates\bevy_ecs\src\schedule\schedule.rs:682:39
// after
thread 'main' panicked at 'System set `A` depends on itself.', examples/stress_tests/bevymark.rs:16:9
// hierarchy loop
// before
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: HierarchyLoop("A")', crates\bevy_ecs\src\schedule\schedule.rs:682:3
// after
thread 'main' panicked at 'System set `A` contains itself.', examples/stress_tests/bevymark.rs:16:9
// configuring a system type set
// before
thread 'main' panicked at 'configuring system type sets is not allowed', crates\bevy_ecs\src\schedule\config.rs:394:9
//after
thread 'main' panicked at 'configuring system type sets is not allowed', examples/stress_tests/bevymark.rs:16:9
```
Code to produce errors:
```rust
use bevy::prelude::*;
#[derive(SystemSet, Clone, Debug, PartialEq, Eq, Hash)]
enum TestSet {
A,
}
fn main() {
fn foo() {}
let mut app = App::empty();
// Hierarchy Loop
app.configure_set(Main, TestSet::A.in_set(TestSet::A));
// Dependency Loop
app.configure_set(Main, TestSet::A.after(TestSet::A));
// Configure System Type Set
app.configure_set(Main, foo.into_system_set());
}
```
This commit is contained in:
parent
087a345579
commit
4e59671ae7
@ -393,6 +393,7 @@ impl App {
|
||||
}
|
||||
|
||||
/// Configures a system set in the default schedule, adding the set if it does not exist.
|
||||
#[track_caller]
|
||||
pub fn configure_set(
|
||||
&mut self,
|
||||
schedule: impl ScheduleLabel,
|
||||
@ -410,6 +411,7 @@ impl App {
|
||||
}
|
||||
|
||||
/// Configures a collection of system sets in the default schedule, adding any sets that do not exist.
|
||||
#[track_caller]
|
||||
pub fn configure_sets(
|
||||
&mut self,
|
||||
schedule: impl ScheduleLabel,
|
||||
|
||||
@ -393,6 +393,7 @@ pub struct SystemSetConfig {
|
||||
}
|
||||
|
||||
impl SystemSetConfig {
|
||||
#[track_caller]
|
||||
fn new(set: BoxedSystemSet) -> Self {
|
||||
// system type sets are automatically populated
|
||||
// to avoid unintentionally broad changes, they cannot be configured
|
||||
@ -449,6 +450,7 @@ pub trait IntoSystemSetConfig: Sized {
|
||||
}
|
||||
|
||||
impl<S: SystemSet> IntoSystemSetConfig for S {
|
||||
#[track_caller]
|
||||
fn into_config(self) -> SystemSetConfig {
|
||||
SystemSetConfig::new(Box::new(self))
|
||||
}
|
||||
|
||||
@ -181,12 +181,14 @@ impl Schedule {
|
||||
}
|
||||
|
||||
/// Configures a system set in this schedule, adding it if it does not exist.
|
||||
#[track_caller]
|
||||
pub fn configure_set(&mut self, set: impl IntoSystemSetConfig) -> &mut Self {
|
||||
self.graph.configure_set(set);
|
||||
self
|
||||
}
|
||||
|
||||
/// Configures a collection of system sets in this schedule, adding them if they does not exist.
|
||||
#[track_caller]
|
||||
pub fn configure_sets(&mut self, sets: impl IntoSystemSetConfigs) -> &mut Self {
|
||||
self.graph.configure_sets(sets);
|
||||
self
|
||||
@ -656,6 +658,7 @@ impl ScheduleGraph {
|
||||
Ok(id)
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
fn configure_sets(&mut self, sets: impl IntoSystemSetConfigs) {
|
||||
let SystemSetConfigs { sets, chained } = sets.into_configs();
|
||||
let mut set_iter = sets.into_iter();
|
||||
@ -669,15 +672,25 @@ impl ScheduleGraph {
|
||||
}
|
||||
} else {
|
||||
for set in set_iter {
|
||||
self.configure_set_inner(set).unwrap();
|
||||
if let Err(e) = self.configure_set_inner(set) {
|
||||
// using `unwrap_or_else(panic!)` led to the error being reported
|
||||
// from this line instead of in the user code
|
||||
panic!("{e}");
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
fn configure_set(&mut self, set: impl IntoSystemSetConfig) {
|
||||
self.configure_set_inner(set).unwrap();
|
||||
if let Err(e) = self.configure_set_inner(set) {
|
||||
// using `unwrap_or_else(panic!)` led to the error being reported
|
||||
// from this line instead of in the user code
|
||||
panic!("{e}");
|
||||
};
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
fn configure_set_inner(
|
||||
&mut self,
|
||||
set: impl IntoSystemSetConfig,
|
||||
@ -1560,7 +1573,7 @@ impl ScheduleGraph {
|
||||
#[non_exhaustive]
|
||||
pub enum ScheduleBuildError {
|
||||
/// A system set contains itself.
|
||||
#[error("`{0:?}` contains itself.")]
|
||||
#[error("System set `{0}` contains itself.")]
|
||||
HierarchyLoop(String),
|
||||
/// The hierarchy of system sets contains a cycle.
|
||||
#[error("System set hierarchy contains cycle(s).\n{0}")]
|
||||
@ -1571,7 +1584,7 @@ pub enum ScheduleBuildError {
|
||||
#[error("System set hierarchy contains redundant edges.\n{0}")]
|
||||
HierarchyRedundancy(String),
|
||||
/// A system (set) has been told to run before itself.
|
||||
#[error("`{0:?}` depends on itself.")]
|
||||
#[error("System set `{0}` depends on itself.")]
|
||||
DependencyLoop(String),
|
||||
/// The dependency graph contains a cycle.
|
||||
#[error("System dependencies contain cycle(s).\n{0}")]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user