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:
Niklas Eicker 2024-06-10 09:10:52 +02:00 committed by GitHub
parent 3478d158cc
commit 69d7da9b37
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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>();
}
} }