bevy_asset/direct_access_ext.rs
1//! Add methods on `World` to simplify loading assets when all
2//! you have is a `World`.
3
4use bevy_ecs::world::World;
5
6use crate::{Asset, AssetPath, AssetServer, Assets, Handle, LoadBuilder};
7
8/// An extension trait for methods for working with assets directly from a [`World`].
9pub trait DirectAssetAccessExt {
10 /// Insert an asset similarly to [`Assets::add`].
11 fn add_asset<A: Asset>(&mut self, asset: impl Into<A>) -> Handle<A>;
12
13 /// Load an asset similarly to [`AssetServer::load`].
14 fn load_asset<'a, A: Asset>(&self, path: impl Into<AssetPath<'a>>) -> Handle<A>;
15
16 /// Creates a new [`LoadBuilder`] similar to [`AssetServer::load_builder`].
17 fn load_builder(&self) -> LoadBuilder<'_>;
18}
19
20impl DirectAssetAccessExt for World {
21 /// Insert an asset similarly to [`Assets::add`].
22 ///
23 /// # Panics
24 /// If `self` doesn't have an [`AssetServer`] resource initialized yet.
25 fn add_asset<'a, A: Asset>(&mut self, asset: impl Into<A>) -> Handle<A> {
26 self.resource_mut::<Assets<A>>().add(asset)
27 }
28
29 /// Load an asset similarly to [`AssetServer::load`].
30 ///
31 /// # Panics
32 /// If `self` doesn't have an [`AssetServer`] resource initialized yet.
33 fn load_asset<'a, A: Asset>(&self, path: impl Into<AssetPath<'a>>) -> Handle<A> {
34 self.resource::<AssetServer>().load(path)
35 }
36
37 /// Creates a new [`LoadBuilder`] similar to [`AssetServer::load_builder`].
38 ///
39 /// # Panics
40 /// If `self` doesn't have an [`AssetServer`] resource initialized yet.
41 fn load_builder(&self) -> LoadBuilder<'_> {
42 self.resource::<AssetServer>().load_builder()
43 }
44}