Skip to content

Commit 1f54f32

Browse files
rafalhShatur
authored andcommitted
Make AssetLoader/Saver Error type bounds compatible with anyhow::Error (bevyengine#10493)
# Objective * In Bevy 0.11 asset loaders used `anyhow::Error` for returning errors. In Bevy 0.12 `AssetLoader` (and `AssetSaver`) have associated `Error` type. Unfortunately it's type bounds does not allow `anyhow::Error` to be used despite migration guide claiming otherwise. This makes migration to 0.12 more challenging. Solve this by changing type bounds for associated `Error` type. * Fix bevyengine#10350 ## Solution Change associated `Error` type bounds to require `Into<Box<dyn std::error::Error + Send + Sync + 'static>>` to be implemented instead of `std::error::Error + Send + Sync + 'static`. Both `anyhow::Error` and errors generated by `thiserror` seems to be fine with such type bound. --- ## Changelog ### Fixed * Fixed compatibility with `anyhow::Error` in `AssetLoader` and `AssetSaver` associated `Error` type
1 parent bf30a25 commit 1f54f32

File tree

3 files changed

+9
-5
lines changed

3 files changed

+9
-5
lines changed

crates/bevy_asset/src/loader.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub trait AssetLoader: Send + Sync + 'static {
2828
/// The settings type used by this [`AssetLoader`].
2929
type Settings: Settings + Default + Serialize + for<'a> Deserialize<'a>;
3030
/// The type of [error](`std::error::Error`) which could be encountered by this loader.
31-
type Error: std::error::Error + Send + Sync + 'static;
31+
type Error: Into<Box<dyn std::error::Error + Send + Sync + 'static>>;
3232
/// Asynchronously loads [`AssetLoader::Asset`] (and any other labeled assets) from the bytes provided by [`Reader`].
3333
fn load<'a>(
3434
&'a self,
@@ -90,7 +90,9 @@ where
9090
.expect("Loader settings should exist")
9191
.downcast_ref::<L::Settings>()
9292
.expect("AssetLoader settings should match the loader type");
93-
let asset = <L as AssetLoader>::load(self, reader, settings, &mut load_context).await?;
93+
let asset = <L as AssetLoader>::load(self, reader, settings, &mut load_context)
94+
.await
95+
.map_err(|error| error.into())?;
9496
Ok(load_context.finish(asset, Some(meta)).into())
9597
})
9698
}

crates/bevy_asset/src/processor/process.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ impl<Loader: AssetLoader, Saver: AssetSaver<Asset = Loader::Asset>> Process
138138
.saver
139139
.save(writer, saved_asset, &settings.saver_settings)
140140
.await
141-
.map_err(|error| ProcessError::AssetSaveError(Box::new(error)))?;
141+
.map_err(|error| ProcessError::AssetSaveError(error.into()))?;
142142
Ok(output_settings)
143143
})
144144
}

crates/bevy_asset/src/saver.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub trait AssetSaver: Send + Sync + 'static {
1414
/// The type of [`AssetLoader`] used to load this [`Asset`]
1515
type OutputLoader: AssetLoader;
1616
/// The type of [error](`std::error::Error`) which could be encountered by this saver.
17-
type Error: std::error::Error + Send + Sync + 'static;
17+
type Error: Into<Box<dyn std::error::Error + Send + Sync + 'static>>;
1818

1919
/// Saves the given runtime [`Asset`] by writing it to a byte format using `writer`. The passed in `settings` can influence how the
2020
/// `asset` is saved.
@@ -53,7 +53,9 @@ impl<S: AssetSaver> ErasedAssetSaver for S {
5353
.downcast_ref::<S::Settings>()
5454
.expect("AssetLoader settings should match the loader type");
5555
let saved_asset = SavedAsset::<S::Asset>::from_loaded(asset).unwrap();
56-
self.save(writer, saved_asset, settings).await?;
56+
if let Err(err) = self.save(writer, saved_asset, settings).await {
57+
return Err(err.into());
58+
}
5759
Ok(())
5860
})
5961
}

0 commit comments

Comments
 (0)