Skip to content

Commit 8d12cf9

Browse files
committed
init
1 parent 8316d89 commit 8d12cf9

File tree

11 files changed

+181
-110
lines changed

11 files changed

+181
-110
lines changed

crates/bevy_ecs/src/observer/runner.rs

+9-2
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

+10-10
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

+44-10
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
};
@@ -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,39 @@ 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+
if system.update_validity_warning() {
361+
validity_warning::system(&system.name());
362+
}
363+
Err(RunSystemError::InvalidParameters(system.name()))
364+
} else {
365+
Ok(system.run(input, self))
366+
}
367+
}
368+
}
369+
370+
/// Running system failed.
371+
#[derive(Error)]
372+
pub enum RunSystemError {
373+
/// System could not run due to invalid parameters.
374+
#[error("System {0:?} has invalid parameters")]
375+
InvalidParameters(Cow<'static, str>),
376+
}
377+
378+
impl Debug for RunSystemError {
379+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
380+
match self {
381+
Self::InvalidParameters(arg0) => {
382+
f.debug_tuple("InvalidParameters").field(arg0).finish()
383+
}
384+
}
351385
}
352386
}
353387

@@ -369,7 +403,7 @@ mod tests {
369403
}
370404

371405
let mut world = World::default();
372-
let n = world.run_system_once_with(1, system);
406+
let n = world.run_system_once_with(1, system).unwrap();
373407
assert_eq!(n, 2);
374408
assert_eq!(world.resource::<T>().0, 1);
375409
}
@@ -387,9 +421,9 @@ mod tests {
387421
let mut world = World::new();
388422
world.init_resource::<Counter>();
389423
assert_eq!(*world.resource::<Counter>(), Counter(0));
390-
world.run_system_once(count_up);
424+
world.run_system_once(count_up).unwrap();
391425
assert_eq!(*world.resource::<Counter>(), Counter(1));
392-
world.run_system_once(count_up);
426+
world.run_system_once(count_up).unwrap();
393427
assert_eq!(*world.resource::<Counter>(), Counter(2));
394428
}
395429

@@ -402,7 +436,7 @@ mod tests {
402436
fn command_processing() {
403437
let mut world = World::new();
404438
assert_eq!(world.entities.len(), 0);
405-
world.run_system_once(spawn_entity);
439+
world.run_system_once(spawn_entity).unwrap();
406440
assert_eq!(world.entities.len(), 1);
407441
}
408442

@@ -415,7 +449,7 @@ mod tests {
415449
let mut world = World::new();
416450
world.insert_non_send_resource(Counter(10));
417451
assert_eq!(*world.non_send_resource::<Counter>(), Counter(10));
418-
world.run_system_once(non_send_count_down);
452+
world.run_system_once(non_send_count_down).unwrap();
419453
assert_eq!(*world.non_send_resource::<Counter>(), Counter(9));
420454
}
421455
}

crates/bevy_ecs/src/system/system_name.rs

+4-4
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)