From e69ab92baff1fa37cfe10936c9f86f006f76e2ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Harabie=C5=84?= Date: Tue, 14 Nov 2023 02:25:06 +0100 Subject: [PATCH] Make AssetLoader/Saver Error type bounds compatible with anyhow::Error (#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 #10350 ## Solution Change associated `Error` type bounds to require `Into>` 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 --- crates/bevy_asset/src/loader.rs | 6 ++++-- crates/bevy_asset/src/processor/process.rs | 2 +- crates/bevy_asset/src/saver.rs | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/crates/bevy_asset/src/loader.rs b/crates/bevy_asset/src/loader.rs index 3a5bbc7d03..a30099197e 100644 --- a/crates/bevy_asset/src/loader.rs +++ b/crates/bevy_asset/src/loader.rs @@ -28,7 +28,7 @@ pub trait AssetLoader: Send + Sync + 'static { /// The settings type used by this [`AssetLoader`]. type Settings: Settings + Default + Serialize + for<'a> Deserialize<'a>; /// The type of [error](`std::error::Error`) which could be encountered by this loader. - type Error: std::error::Error + Send + Sync + 'static; + type Error: Into>; /// Asynchronously loads [`AssetLoader::Asset`] (and any other labeled assets) from the bytes provided by [`Reader`]. fn load<'a>( &'a self, @@ -90,7 +90,9 @@ where .expect("Loader settings should exist") .downcast_ref::() .expect("AssetLoader settings should match the loader type"); - let asset = ::load(self, reader, settings, &mut load_context).await?; + let asset = ::load(self, reader, settings, &mut load_context) + .await + .map_err(|error| error.into())?; Ok(load_context.finish(asset, Some(meta)).into()) }) } diff --git a/crates/bevy_asset/src/processor/process.rs b/crates/bevy_asset/src/processor/process.rs index ef6a3fbb2f..fd4f46630b 100644 --- a/crates/bevy_asset/src/processor/process.rs +++ b/crates/bevy_asset/src/processor/process.rs @@ -138,7 +138,7 @@ impl> Process .saver .save(writer, saved_asset, &settings.saver_settings) .await - .map_err(|error| ProcessError::AssetSaveError(Box::new(error)))?; + .map_err(|error| ProcessError::AssetSaveError(error.into()))?; Ok(output_settings) }) } diff --git a/crates/bevy_asset/src/saver.rs b/crates/bevy_asset/src/saver.rs index 0b01b7d91e..be1b17704b 100644 --- a/crates/bevy_asset/src/saver.rs +++ b/crates/bevy_asset/src/saver.rs @@ -14,7 +14,7 @@ pub trait AssetSaver: Send + Sync + 'static { /// The type of [`AssetLoader`] used to load this [`Asset`] type OutputLoader: AssetLoader; /// The type of [error](`std::error::Error`) which could be encountered by this saver. - type Error: std::error::Error + Send + Sync + 'static; + type Error: Into>; /// Saves the given runtime [`Asset`] by writing it to a byte format using `writer`. The passed in `settings` can influence how the /// `asset` is saved. @@ -53,7 +53,9 @@ impl ErasedAssetSaver for S { .downcast_ref::() .expect("AssetLoader settings should match the loader type"); let saved_asset = SavedAsset::::from_loaded(asset).unwrap(); - self.save(writer, saved_asset, settings).await?; + if let Err(err) = self.save(writer, saved_asset, settings).await { + return Err(err.into()); + } Ok(()) }) }