@@ -180,6 +180,7 @@ impl<'w> WorldCell<'w> {
180
180
}
181
181
}
182
182
183
+ /// Gets a reference to the resource of the given type
183
184
pub fn get_resource < T : Resource > ( & self ) -> Option < WorldBorrow < ' _ , T > > {
184
185
let component_id = self . world . components . get_resource_id ( TypeId :: of :: < T > ( ) ) ?;
185
186
let resource_archetype = self . world . archetypes . resource ( ) ;
@@ -192,6 +193,26 @@ impl<'w> WorldCell<'w> {
192
193
) )
193
194
}
194
195
196
+ /// Gets a reference to the resource of the given type
197
+ ///
198
+ /// # Panics
199
+ ///
200
+ /// Panics if the resource does not exist. Use [`get_resource`](WorldCell::get_resource) instead
201
+ /// if you want to handle this case.
202
+ pub fn resource < T : Resource > ( & self ) -> WorldBorrow < ' _ , T > {
203
+ match self . get_resource ( ) {
204
+ Some ( x) => x,
205
+ None => panic ! (
206
+ "Requested resource {} does not exist in the `World`.
207
+ Did you forget to add it using `app.add_resource` / `app.init_resource`?
208
+ Resources are also implicitly added via `app.add_event`,
209
+ and can be added by plugins." ,
210
+ std:: any:: type_name:: <T >( )
211
+ ) ,
212
+ }
213
+ }
214
+
215
+ /// Gets a mutable reference to the resource of the given type
195
216
pub fn get_resource_mut < T : Resource > ( & self ) -> Option < WorldBorrowMut < ' _ , T > > {
196
217
let component_id = self . world . components . get_resource_id ( TypeId :: of :: < T > ( ) ) ?;
197
218
let resource_archetype = self . world . archetypes . resource ( ) ;
@@ -207,7 +228,27 @@ impl<'w> WorldCell<'w> {
207
228
) )
208
229
}
209
230
210
- pub fn get_non_send < T : ' static > ( & self ) -> Option < WorldBorrow < ' _ , T > > {
231
+ /// Gets a mutable reference to the resource of the given type
232
+ ///
233
+ /// # Panics
234
+ ///
235
+ /// Panics if the resource does not exist. Use [`get_resource_mut`](WorldCell::get_resource_mut)
236
+ /// instead if you want to handle this case.
237
+ pub fn resource_mut < T : Resource > ( & self ) -> WorldBorrowMut < ' _ , T > {
238
+ match self . get_resource_mut ( ) {
239
+ Some ( x) => x,
240
+ None => panic ! (
241
+ "Requested resource {} does not exist in the `World`.
242
+ Did you forget to add it using `app.add_resource` / `app.init_resource`?
243
+ Resources are also implicitly added via `app.add_event`,
244
+ and can be added by plugins." ,
245
+ std:: any:: type_name:: <T >( )
246
+ ) ,
247
+ }
248
+ }
249
+
250
+ /// Gets an immutable reference to the non-send resource of the given type, if it exists.
251
+ pub fn get_non_send_resource < T : ' static > ( & self ) -> Option < WorldBorrow < ' _ , T > > {
211
252
let component_id = self . world . components . get_resource_id ( TypeId :: of :: < T > ( ) ) ?;
212
253
let resource_archetype = self . world . archetypes . resource ( ) ;
213
254
let archetype_component_id = resource_archetype. get_archetype_component_id ( component_id) ?;
@@ -219,7 +260,27 @@ impl<'w> WorldCell<'w> {
219
260
) )
220
261
}
221
262
222
- pub fn get_non_send_mut < T : ' static > ( & self ) -> Option < WorldBorrowMut < ' _ , T > > {
263
+ /// Gets an immutable reference to the non-send resource of the given type, if it exists.
264
+ ///
265
+ /// # Panics
266
+ ///
267
+ /// Panics if the resource does not exist. Use
268
+ /// [`get_non_send_resource`](WorldCell::get_non_send_resource) instead if you want to handle
269
+ /// this case.
270
+ pub fn non_send_resource < T : ' static > ( & self ) -> WorldBorrow < ' _ , T > {
271
+ match self . get_non_send_resource ( ) {
272
+ Some ( x) => x,
273
+ None => panic ! (
274
+ "Requested non-send resource {} does not exist in the `World`.
275
+ Did you forget to add it using `app.add_non_send_resource` / `app.init_non_send_resource`?
276
+ Non-send resources can also be be added by plugins." ,
277
+ std:: any:: type_name:: <T >( )
278
+ ) ,
279
+ }
280
+ }
281
+
282
+ /// Gets a mutable reference to the non-send resource of the given type, if it exists.
283
+ pub fn get_non_send_resource_mut < T : ' static > ( & self ) -> Option < WorldBorrowMut < ' _ , T > > {
223
284
let component_id = self . world . components . get_resource_id ( TypeId :: of :: < T > ( ) ) ?;
224
285
let resource_archetype = self . world . archetypes . resource ( ) ;
225
286
let archetype_component_id = resource_archetype. get_archetype_component_id ( component_id) ?;
@@ -233,6 +294,25 @@ impl<'w> WorldCell<'w> {
233
294
self . access . clone ( ) ,
234
295
) )
235
296
}
297
+
298
+ /// Gets a mutable reference to the non-send resource of the given type, if it exists.
299
+ ///
300
+ /// # Panics
301
+ ///
302
+ /// Panics if the resource does not exist. Use
303
+ /// [`get_non_send_resource_mut`](WorldCell::get_non_send_resource_mut) instead if you want to
304
+ /// handle this case.
305
+ pub fn non_send_resource_mut < T : ' static > ( & self ) -> WorldBorrowMut < ' _ , T > {
306
+ match self . get_non_send_resource_mut ( ) {
307
+ Some ( x) => x,
308
+ None => panic ! (
309
+ "Requested non-send resource {} does not exist in the `World`.
310
+ Did you forget to add it using `app.add_non_send_resource` / `app.init_non_send_resource`?
311
+ Non-send resources can also be be added by plugins." ,
312
+ std:: any:: type_name:: <T >( )
313
+ ) ,
314
+ }
315
+ }
236
316
}
237
317
238
318
#[ cfg( test) ]
@@ -248,28 +328,28 @@ mod tests {
248
328
world. insert_resource ( 1u64 ) ;
249
329
let cell = world. cell ( ) ;
250
330
{
251
- let mut a = cell. get_resource_mut :: < u32 > ( ) . unwrap ( ) ;
331
+ let mut a = cell. resource_mut :: < u32 > ( ) ;
252
332
assert_eq ! ( 1 , * a) ;
253
333
* a = 2 ;
254
334
}
255
335
{
256
- let a = cell. get_resource :: < u32 > ( ) . unwrap ( ) ;
336
+ let a = cell. resource :: < u32 > ( ) ;
257
337
assert_eq ! ( 2 , * a, "ensure access is dropped" ) ;
258
338
259
- let b = cell. get_resource :: < u32 > ( ) . unwrap ( ) ;
339
+ let b = cell. resource :: < u32 > ( ) ;
260
340
assert_eq ! (
261
341
2 , * b,
262
342
"ensure multiple immutable accesses can occur at the same time"
263
343
) ;
264
344
}
265
345
{
266
- let a = cell. get_resource_mut :: < u32 > ( ) . unwrap ( ) ;
346
+ let a = cell. resource_mut :: < u32 > ( ) ;
267
347
assert_eq ! (
268
348
2 , * a,
269
349
"ensure both immutable accesses are dropped, enabling a new mutable access"
270
350
) ;
271
351
272
- let b = cell. get_resource :: < u64 > ( ) . unwrap ( ) ;
352
+ let b = cell. resource :: < u64 > ( ) ;
273
353
assert_eq ! (
274
354
1 , * b,
275
355
"ensure multiple non-conflicting mutable accesses can occur at the same time"
@@ -284,7 +364,7 @@ mod tests {
284
364
{
285
365
let cell = world. cell ( ) ;
286
366
{
287
- let mut a = cell. get_resource_mut :: < u32 > ( ) . unwrap ( ) ;
367
+ let mut a = cell. resource_mut :: < u32 > ( ) ;
288
368
assert_eq ! ( 1 , * a) ;
289
369
* a = 2 ;
290
370
}
@@ -315,8 +395,8 @@ mod tests {
315
395
let mut world = World :: default ( ) ;
316
396
world. insert_resource ( 1u32 ) ;
317
397
let cell = world. cell ( ) ;
318
- let _value_a = cell. get_resource_mut :: < u32 > ( ) . unwrap ( ) ;
319
- let _value_b = cell. get_resource_mut :: < u32 > ( ) . unwrap ( ) ;
398
+ let _value_a = cell. resource_mut :: < u32 > ( ) ;
399
+ let _value_b = cell. resource_mut :: < u32 > ( ) ;
320
400
}
321
401
322
402
#[ test]
@@ -325,8 +405,8 @@ mod tests {
325
405
let mut world = World :: default ( ) ;
326
406
world. insert_resource ( 1u32 ) ;
327
407
let cell = world. cell ( ) ;
328
- let _value_a = cell. get_resource :: < u32 > ( ) . unwrap ( ) ;
329
- let _value_b = cell. get_resource_mut :: < u32 > ( ) . unwrap ( ) ;
408
+ let _value_a = cell. resource :: < u32 > ( ) ;
409
+ let _value_b = cell. resource_mut :: < u32 > ( ) ;
330
410
}
331
411
332
412
#[ test]
@@ -335,8 +415,8 @@ mod tests {
335
415
let mut world = World :: default ( ) ;
336
416
world. insert_resource ( 1u32 ) ;
337
417
let cell = world. cell ( ) ;
338
- let _value_a = cell. get_resource_mut :: < u32 > ( ) . unwrap ( ) ;
339
- let _value_b = cell. get_resource :: < u32 > ( ) . unwrap ( ) ;
418
+ let _value_a = cell. resource_mut :: < u32 > ( ) ;
419
+ let _value_b = cell. resource :: < u32 > ( ) ;
340
420
}
341
421
342
422
#[ test]
@@ -345,7 +425,7 @@ mod tests {
345
425
let mut world = World :: default ( ) ;
346
426
world. insert_resource ( 1u32 ) ;
347
427
let cell = world. cell ( ) ;
348
- let _value_a = cell. get_resource_mut :: < u32 > ( ) . unwrap ( ) ;
349
- let _value_b = cell. get_resource :: < u32 > ( ) . unwrap ( ) ;
428
+ let _value_a = cell. resource_mut :: < u32 > ( ) ;
429
+ let _value_b = cell. resource :: < u32 > ( ) ;
350
430
}
351
431
}
0 commit comments