Skip to content

Commit 79103ff

Browse files
committed
init
1 parent d217110 commit 79103ff

File tree

11 files changed

+181
-110
lines changed

11 files changed

+181
-110
lines changed

crates/bevy_ecs/src/observer/runner.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::{
55
observer::{ObserverDescriptor, ObserverTrigger},
66
prelude::*,
77
query::DebugCheckedUnwrap,
8+
schedule::validity_warning,
89
system::{IntoObserverSystem, ObserverSystem},
910
world::DeferredWorld,
1011
};
@@ -374,8 +375,14 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
374375
// - system is the same type erased system from above
375376
unsafe {
376377
(*system).update_archetype_component_access(world);
377-
(*system).run_unsafe(trigger, world);
378-
(*system).queue_deferred(world.into_deferred());
378+
if !(*system).validate_param_unsafe(world) {
379+
if (*system).update_validity_warning() {
380+
validity_warning::system(&(*system).name());
381+
}
382+
} else {
383+
(*system).run_unsafe(trigger, world);
384+
(*system).queue_deferred(world.into_deferred());
385+
}
379386
}
380387
}
381388

crates/bevy_ecs/src/system/builder.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ mod tests {
386386
.build_state(&mut world)
387387
.build_system(local_system);
388388

389-
let result = world.run_system_once(system);
389+
let result = world.run_system_once(system).unwrap();
390390
assert_eq!(result, 10);
391391
}
392392

@@ -403,7 +403,7 @@ mod tests {
403403
.build_state(&mut world)
404404
.build_system(query_system);
405405

406-
let result = world.run_system_once(system);
406+
let result = world.run_system_once(system).unwrap();
407407
assert_eq!(result, 1);
408408
}
409409

@@ -418,7 +418,7 @@ mod tests {
418418

419419
let system = (state,).build_state(&mut world).build_system(query_system);
420420

421-
let result = world.run_system_once(system);
421+
let result = world.run_system_once(system).unwrap();
422422
assert_eq!(result, 1);
423423
}
424424

@@ -433,7 +433,7 @@ mod tests {
433433
.build_state(&mut world)
434434
.build_system(multi_param_system);
435435

436-
let result = world.run_system_once(system);
436+
let result = world.run_system_once(system).unwrap();
437437
assert_eq!(result, 1);
438438
}
439439

@@ -464,7 +464,7 @@ mod tests {
464464
count
465465
});
466466

467-
let result = world.run_system_once(system);
467+
let result = world.run_system_once(system).unwrap();
468468
assert_eq!(result, 3);
469469
}
470470

@@ -479,7 +479,7 @@ mod tests {
479479
.build_state(&mut world)
480480
.build_system(|a, b| *a + *b + 1);
481481

482-
let result = world.run_system_once(system);
482+
let result = world.run_system_once(system).unwrap();
483483
assert_eq!(result, 1);
484484
}
485485

@@ -506,7 +506,7 @@ mod tests {
506506
params.p0().iter().count() + params.p1().iter().count()
507507
});
508508

509-
let result = world.run_system_once(system);
509+
let result = world.run_system_once(system).unwrap();
510510
assert_eq!(result, 5);
511511
}
512512

@@ -535,7 +535,7 @@ mod tests {
535535
count
536536
});
537537

538-
let result = world.run_system_once(system);
538+
let result = world.run_system_once(system).unwrap();
539539
assert_eq!(result, 5);
540540
}
541541

@@ -564,7 +564,7 @@ mod tests {
564564
},
565565
);
566566

567-
let result = world.run_system_once(system);
567+
let result = world.run_system_once(system).unwrap();
568568
assert_eq!(result, 4);
569569
}
570570

@@ -591,7 +591,7 @@ mod tests {
591591
.build_state(&mut world)
592592
.build_system(|param: CustomParam| *param.local + param.query.iter().count());
593593

594-
let result = world.run_system_once(system);
594+
let result = world.run_system_once(system).unwrap();
595595
assert_eq!(result, 101);
596596
}
597597
}

crates/bevy_ecs/src/system/system.rs

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use bevy_utils::tracing::warn;
22
use core::fmt::Debug;
3+
use thiserror::Error;
34

45
use crate::{
56
archetype::ArchetypeComponentId,
67
component::{ComponentId, Tick},
78
query::Access,
8-
schedule::InternedSystemSet,
9+
schedule::{validity_warning, InternedSystemSet},
910
system::{input::SystemInput, SystemIn},
1011
world::{unsafe_world_cell::UnsafeWorldCell, DeferredWorld, World},
1112
};
@@ -322,19 +323,27 @@ where
322323
/// ```
323324
pub trait RunSystemOnce: Sized {
324325
/// Runs a system and applies its deferred parameters.
325-
fn run_system_once<T, Out, Marker>(self, system: T) -> Out
326+
///
327+
/// If system parameters were invalid, system isn't executed and
328+
/// the return value is [`None`].
329+
#[must_use = "The system may have not ran."]
330+
fn run_system_once<T, Out, Marker>(self, system: T) -> Result<Out, RunSystemError>
326331
where
327332
T: IntoSystem<(), Out, Marker>,
328333
{
329334
self.run_system_once_with((), system)
330335
}
331336

332337
/// Runs a system with given input and applies its deferred parameters.
338+
///
339+
/// If system parameters were invalid, system isn't executed and
340+
/// the return value is [`None`].
341+
#[must_use = "The system may have not ran."]
333342
fn run_system_once_with<T, In, Out, Marker>(
334343
self,
335344
input: SystemIn<'_, T::System>,
336345
system: T,
337-
) -> Out
346+
) -> Result<Out, RunSystemError>
338347
where
339348
T: IntoSystem<In, Out, Marker>,
340349
In: SystemInput;
@@ -345,14 +354,39 @@ impl RunSystemOnce for &mut World {
345354
self,
346355
input: SystemIn<'_, T::System>,
347356
system: T,
348-
) -> Out
357+
) -> Result<Out, RunSystemError>
349358
where
350359
T: IntoSystem<In, Out, Marker>,
351360
In: SystemInput,
352361
{
353362
let mut system: T::System = IntoSystem::into_system(system);
354363
system.initialize(self);
355-
system.run(input, self)
364+
if !system.validate_param(self) {
365+
if system.update_validity_warning() {
366+
validity_warning::system(&system.name());
367+
}
368+
Err(RunSystemError::InvalidParameters(system.name()))
369+
} else {
370+
Ok(system.run(input, self))
371+
}
372+
}
373+
}
374+
375+
/// Running system failed.
376+
#[derive(Error)]
377+
pub enum RunSystemError {
378+
/// System could not run due to invalid parameters.
379+
#[error("System {0:?} has invalid parameters")]
380+
InvalidParameters(Cow<'static, str>),
381+
}
382+
383+
impl Debug for RunSystemError {
384+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
385+
match self {
386+
Self::InvalidParameters(arg0) => {
387+
f.debug_tuple("InvalidParameters").field(arg0).finish()
388+
}
389+
}
356390
}
357391
}
358392

@@ -374,7 +408,7 @@ mod tests {
374408
}
375409

376410
let mut world = World::default();
377-
let n = world.run_system_once_with(1, system);
411+
let n = world.run_system_once_with(1, system).unwrap();
378412
assert_eq!(n, 2);
379413
assert_eq!(world.resource::<T>().0, 1);
380414
}
@@ -392,9 +426,9 @@ mod tests {
392426
let mut world = World::new();
393427
world.init_resource::<Counter>();
394428
assert_eq!(*world.resource::<Counter>(), Counter(0));
395-
world.run_system_once(count_up);
429+
world.run_system_once(count_up).unwrap();
396430
assert_eq!(*world.resource::<Counter>(), Counter(1));
397-
world.run_system_once(count_up);
431+
world.run_system_once(count_up).unwrap();
398432
assert_eq!(*world.resource::<Counter>(), Counter(2));
399433
}
400434

@@ -407,7 +441,7 @@ mod tests {
407441
fn command_processing() {
408442
let mut world = World::new();
409443
assert_eq!(world.entities.len(), 0);
410-
world.run_system_once(spawn_entity);
444+
world.run_system_once(spawn_entity).unwrap();
411445
assert_eq!(world.entities.len(), 1);
412446
}
413447

@@ -420,7 +454,7 @@ mod tests {
420454
let mut world = World::new();
421455
world.insert_non_send_resource(Counter(10));
422456
assert_eq!(*world.non_send_resource::<Counter>(), Counter(10));
423-
world.run_system_once(non_send_count_down);
457+
world.run_system_once(non_send_count_down).unwrap();
424458
assert_eq!(*world.non_send_resource::<Counter>(), Counter(9));
425459
}
426460
}

crates/bevy_ecs/src/system/system_name.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ mod tests {
120120

121121
let mut world = World::default();
122122
let id = world.register_system(testing);
123-
let name = world.run_system(id).unwrap();
123+
let name = world.try_run_system(id).unwrap();
124124
assert!(name.ends_with("testing"));
125125
}
126126

@@ -132,7 +132,7 @@ mod tests {
132132

133133
let mut world = World::default();
134134
let id = world.register_system(testing);
135-
let name = world.run_system(id).unwrap();
135+
let name = world.try_run_system(id).unwrap();
136136
assert!(name.ends_with("testing"));
137137
}
138138

@@ -141,7 +141,7 @@ mod tests {
141141
let mut world = World::default();
142142
let system =
143143
IntoSystem::into_system(|name: SystemName| name.name().to_owned()).with_name("testing");
144-
let name = world.run_system_once(system);
144+
let name = world.run_system_once(system).unwrap();
145145
assert_eq!(name, "testing");
146146
}
147147

@@ -151,7 +151,7 @@ mod tests {
151151
let system =
152152
IntoSystem::into_system(|_world: &mut World, name: SystemName| name.name().to_owned())
153153
.with_name("testing");
154-
let name = world.run_system_once(system);
154+
let name = world.run_system_once(system).unwrap();
155155
assert_eq!(name, "testing");
156156
}
157157
}

0 commit comments

Comments
 (0)