Skip to content

Commit 70789ac

Browse files
committed
init
1 parent 8316d89 commit 70789ac

File tree

11 files changed

+168
-109
lines changed

11 files changed

+168
-109
lines changed

crates/bevy_ecs/src/observer/runner.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,10 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
374374
// - system is the same type erased system from above
375375
unsafe {
376376
(*system).update_archetype_component_access(world);
377-
(*system).run_unsafe(trigger, world);
378-
(*system).queue_deferred(world.into_deferred());
377+
if (*system).validate_param_unsafe(world) {
378+
(*system).run_unsafe(trigger, world);
379+
(*system).queue_deferred(world.into_deferred());
380+
}
379381
}
380382
}
381383

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: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use bevy_utils::tracing::warn;
22
use core::fmt::Debug;
3+
use thiserror::Error;
34

45
use crate::{
56
archetype::ArchetypeComponentId,
@@ -317,19 +318,27 @@ where
317318
/// ```
318319
pub trait RunSystemOnce: Sized {
319320
/// Runs a system and applies its deferred parameters.
320-
fn run_system_once<T, Out, Marker>(self, system: T) -> Out
321+
///
322+
/// If system parameters were invalid, system isn't executed and
323+
/// the return value is [`None`].
324+
#[must_use = "The system may have not ran."]
325+
fn run_system_once<T, Out, Marker>(self, system: T) -> Result<Out, RunSystemError>
321326
where
322327
T: IntoSystem<(), Out, Marker>,
323328
{
324329
self.run_system_once_with((), system)
325330
}
326331

327332
/// Runs a system with given input and applies its deferred parameters.
333+
///
334+
/// If system parameters were invalid, system isn't executed and
335+
/// the return value is [`None`].
336+
#[must_use = "The system may have not ran."]
328337
fn run_system_once_with<T, In, Out, Marker>(
329338
self,
330339
input: SystemIn<'_, T::System>,
331340
system: T,
332-
) -> Out
341+
) -> Result<Out, RunSystemError>
333342
where
334343
T: IntoSystem<In, Out, Marker>,
335344
In: SystemInput;
@@ -340,14 +349,36 @@ impl RunSystemOnce for &mut World {
340349
self,
341350
input: SystemIn<'_, T::System>,
342351
system: T,
343-
) -> Out
352+
) -> Result<Out, RunSystemError>
344353
where
345354
T: IntoSystem<In, Out, Marker>,
346355
In: SystemInput,
347356
{
348357
let mut system: T::System = IntoSystem::into_system(system);
349358
system.initialize(self);
350-
system.run(input, self)
359+
if system.validate_param(self) {
360+
Ok(system.run(input, self))
361+
} else {
362+
Err(RunSystemError::InvalidParameters(system.name()))
363+
}
364+
}
365+
}
366+
367+
/// Running system failed.
368+
#[derive(Error)]
369+
pub enum RunSystemError {
370+
/// System could not run due to invalid parameters.
371+
#[error("System {0:?} has invalid parameters")]
372+
InvalidParameters(Cow<'static, str>),
373+
}
374+
375+
impl Debug for RunSystemError {
376+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
377+
match self {
378+
Self::InvalidParameters(arg0) => {
379+
f.debug_tuple("InvalidParameters").field(arg0).finish()
380+
}
381+
}
351382
}
352383
}
353384

@@ -369,7 +400,7 @@ mod tests {
369400
}
370401

371402
let mut world = World::default();
372-
let n = world.run_system_once_with(1, system);
403+
let n = world.run_system_once_with(1, system).unwrap();
373404
assert_eq!(n, 2);
374405
assert_eq!(world.resource::<T>().0, 1);
375406
}
@@ -387,9 +418,9 @@ mod tests {
387418
let mut world = World::new();
388419
world.init_resource::<Counter>();
389420
assert_eq!(*world.resource::<Counter>(), Counter(0));
390-
world.run_system_once(count_up);
421+
world.run_system_once(count_up).unwrap();
391422
assert_eq!(*world.resource::<Counter>(), Counter(1));
392-
world.run_system_once(count_up);
423+
world.run_system_once(count_up).unwrap();
393424
assert_eq!(*world.resource::<Counter>(), Counter(2));
394425
}
395426

@@ -402,7 +433,7 @@ mod tests {
402433
fn command_processing() {
403434
let mut world = World::new();
404435
assert_eq!(world.entities.len(), 0);
405-
world.run_system_once(spawn_entity);
436+
world.run_system_once(spawn_entity).unwrap();
406437
assert_eq!(world.entities.len(), 1);
407438
}
408439

@@ -415,7 +446,7 @@ mod tests {
415446
let mut world = World::new();
416447
world.insert_non_send_resource(Counter(10));
417448
assert_eq!(*world.non_send_resource::<Counter>(), Counter(10));
418-
world.run_system_once(non_send_count_down);
449+
world.run_system_once(non_send_count_down).unwrap();
419450
assert_eq!(*world.non_send_resource::<Counter>(), Counter(9));
420451
}
421452
}

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)