Skip to content

Commit a1968f0

Browse files
committed
Make direct, nested loads immediately return an error if trying to load
a subasset.
1 parent 5260b18 commit a1968f0

File tree

3 files changed

+28
-18
lines changed

3 files changed

+28
-18
lines changed

crates/bevy_asset/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1892,7 +1892,8 @@ mod tests {
18921892
run_app_until(&mut app, |_world| match asset_server.load_state(&handle) {
18931893
LoadState::Loading => None,
18941894
LoadState::Failed(err) => {
1895-
assert!(matches!(*err, AssetLoadError::AssetLoaderError(_)));
1895+
let error_message = format!("{err}");
1896+
assert!(error_message.contains("Requested to load an asset path (a.cool.ron#A) with a subasset, but this is unsupported"), "what? \"{error_message}\"");
18961897
Some(())
18971898
}
18981899
state => panic!("Unexpected asset state: {state:?}"),

crates/bevy_asset/src/loader.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -359,10 +359,14 @@ impl<A: Asset> From<CompleteLoadedAsset<A>> for CompleteErasedLoadedAsset {
359359
/// [`NestedLoader::load`]: crate::NestedLoader::load
360360
/// [immediately]: crate::Immediate
361361
#[derive(Error, Debug)]
362-
#[error("Failed to load dependency {dependency:?} {error}")]
363-
pub struct LoadDirectError {
364-
pub dependency: AssetPath<'static>,
365-
pub error: AssetLoadError,
362+
pub enum LoadDirectError {
363+
#[error("Requested to load an asset path ({0:?}) with a subasset, but this is unsupported")]
364+
RequestedSubasset(AssetPath<'static>),
365+
#[error("Failed to load dependency {dependency:?} {error}")]
366+
LoadError {
367+
dependency: AssetPath<'static>,
368+
error: AssetLoadError,
369+
},
366370
}
367371

368372
/// An error that occurs while deserializing [`AssetMeta`].
@@ -621,7 +625,7 @@ impl<'a> LoadContext<'a> {
621625
self.populate_hashes,
622626
)
623627
.await
624-
.map_err(|error| LoadDirectError {
628+
.map_err(|error| LoadDirectError::LoadError {
625629
dependency: path.clone(),
626630
error,
627631
})?;

crates/bevy_asset/src/loader_builders.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -387,13 +387,16 @@ impl<'builder, 'reader, T> NestedLoader<'_, '_, T, Immediate<'builder, 'reader>>
387387
path: &AssetPath<'static>,
388388
asset_type_id: Option<TypeId>,
389389
) -> Result<(Arc<dyn ErasedAssetLoader>, CompleteErasedLoadedAsset), LoadDirectError> {
390+
if path.label().is_some() {
391+
return Err(LoadDirectError::RequestedSubasset(path.clone()));
392+
}
390393
let (mut meta, loader, mut reader) = if let Some(reader) = self.mode.reader {
391394
let loader = if let Some(asset_type_id) = asset_type_id {
392395
self.load_context
393396
.asset_server
394397
.get_asset_loader_with_asset_type_id(asset_type_id)
395398
.await
396-
.map_err(|error| LoadDirectError {
399+
.map_err(|error| LoadDirectError::LoadError {
397400
dependency: path.clone(),
398401
error: error.into(),
399402
})?
@@ -402,7 +405,7 @@ impl<'builder, 'reader, T> NestedLoader<'_, '_, T, Immediate<'builder, 'reader>>
402405
.asset_server
403406
.get_path_asset_loader(path)
404407
.await
405-
.map_err(|error| LoadDirectError {
408+
.map_err(|error| LoadDirectError::LoadError {
406409
dependency: path.clone(),
407410
error: error.into(),
408411
})?
@@ -415,7 +418,7 @@ impl<'builder, 'reader, T> NestedLoader<'_, '_, T, Immediate<'builder, 'reader>>
415418
.asset_server
416419
.get_meta_loader_and_reader(path, asset_type_id)
417420
.await
418-
.map_err(|error| LoadDirectError {
421+
.map_err(|error| LoadDirectError::LoadError {
419422
dependency: path.clone(),
420423
error,
421424
})?;
@@ -453,15 +456,17 @@ impl NestedLoader<'_, '_, StaticTyped, Immediate<'_, '_>> {
453456
self.load_internal(&path, Some(TypeId::of::<A>()))
454457
.await
455458
.and_then(move |(loader, untyped_asset)| {
456-
untyped_asset.downcast::<A>().map_err(|_| LoadDirectError {
457-
dependency: path.clone(),
458-
error: AssetLoadError::RequestedHandleTypeMismatch {
459-
path,
460-
requested: TypeId::of::<A>(),
461-
actual_asset_name: loader.asset_type_name(),
462-
loader_name: loader.type_name(),
463-
},
464-
})
459+
untyped_asset
460+
.downcast::<A>()
461+
.map_err(|_| LoadDirectError::LoadError {
462+
dependency: path.clone(),
463+
error: AssetLoadError::RequestedHandleTypeMismatch {
464+
path,
465+
requested: TypeId::of::<A>(),
466+
actual_asset_name: loader.asset_type_name(),
467+
loader_name: loader.type_name(),
468+
},
469+
})
465470
})
466471
}
467472
}

0 commit comments

Comments
 (0)