Let init_non_send_resource require FromWorld instead of Default (#13779)
# Objective - Let `init_non_send_resource` take `FromWorld` values again, not only `Default` - This reverts an unintended breaking change introduced in #9202 ## Solution - The resource initialized with `init_non_send_resource` requires `FromWorld` again
This commit is contained in:
parent
3478d158cc
commit
69d7da9b37
@ -424,9 +424,12 @@ impl App {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inserts the [`!Send`](Send) resource into the app, initialized with its default value,
|
/// Inserts the [`!Send`](Send) resource into the app if there is no existing instance of `R`.
|
||||||
/// if there is no existing instance of `R`.
|
///
|
||||||
pub fn init_non_send_resource<R: 'static + Default>(&mut self) -> &mut Self {
|
/// `R` must implement [`FromWorld`].
|
||||||
|
/// If `R` implements [`Default`], [`FromWorld`] will be automatically implemented and
|
||||||
|
/// initialize the [`Resource`] with [`Default::default`].
|
||||||
|
pub fn init_non_send_resource<R: 'static + FromWorld>(&mut self) -> &mut Self {
|
||||||
self.world_mut().init_non_send_resource::<R>();
|
self.world_mut().init_non_send_resource::<R>();
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
@ -916,8 +919,11 @@ impl Termination for AppExit {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use std::sync::Mutex;
|
||||||
use std::{marker::PhantomData, mem};
|
use std::{marker::PhantomData, mem};
|
||||||
|
|
||||||
|
use bevy_ecs::prelude::{Resource, World};
|
||||||
|
use bevy_ecs::world::FromWorld;
|
||||||
use bevy_ecs::{event::EventWriter, schedule::ScheduleLabel, system::Commands};
|
use bevy_ecs::{event::EventWriter, schedule::ScheduleLabel, system::Commands};
|
||||||
|
|
||||||
use crate::{App, AppExit, Plugin, Update};
|
use crate::{App, AppExit, Plugin, Update};
|
||||||
@ -1178,4 +1184,31 @@ mod tests {
|
|||||||
// it's nice they're so small let's keep it that way.
|
// it's nice they're so small let's keep it that way.
|
||||||
assert_eq!(mem::size_of::<AppExit>(), mem::size_of::<u8>());
|
assert_eq!(mem::size_of::<AppExit>(), mem::size_of::<u8>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn initializing_resources_from_world() {
|
||||||
|
#[derive(Resource)]
|
||||||
|
struct TestResource;
|
||||||
|
impl FromWorld for TestResource {
|
||||||
|
fn from_world(_world: &mut World) -> Self {
|
||||||
|
TestResource
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Resource)]
|
||||||
|
struct NonSendTestResource {
|
||||||
|
_marker: PhantomData<Mutex<()>>,
|
||||||
|
}
|
||||||
|
impl FromWorld for NonSendTestResource {
|
||||||
|
fn from_world(_world: &mut World) -> Self {
|
||||||
|
NonSendTestResource {
|
||||||
|
_marker: PhantomData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
App::new()
|
||||||
|
.init_non_send_resource::<NonSendTestResource>()
|
||||||
|
.init_resource::<TestResource>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user