Skip to content

Commit 4a1e474

Browse files
committed
Refactor and Improved Error Handling
1 parent 10fa2ee commit 4a1e474

File tree

2 files changed

+39
-27
lines changed

2 files changed

+39
-27
lines changed

crates/bevy_asset/src/lib.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -173,14 +173,18 @@ impl Plugin for AssetPlugin {
173173

174174
#[cfg(not(target_arch = "wasm32"))]
175175
{
176-
let temp_source =
177-
temp::get_temp_source(app.world_mut(), self.temporary_file_path.clone());
176+
match temp::get_temp_source(app.world_mut(), self.temporary_file_path.clone()) {
177+
Ok(source) => {
178+
let mut sources = app
179+
.world_mut()
180+
.get_resource_or_insert_with::<AssetSourceBuilders>(Default::default);
178181

179-
let mut sources = app
180-
.world_mut()
181-
.get_resource_or_insert_with::<AssetSourceBuilders>(Default::default);
182-
183-
sources.insert("temp", temp_source);
182+
sources.insert("temp", source);
183+
}
184+
Err(error) => {
185+
error!("Could not setup temp:// AssetSource due to an IO Error: {error}");
186+
}
187+
};
184188
}
185189

186190
{

crates/bevy_asset/src/temp.rs

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1-
use std::path::{Path, PathBuf};
1+
use std::{
2+
io::{Error, ErrorKind},
3+
path::{Path, PathBuf},
4+
};
25

36
use bevy_ecs::{system::Resource, world::World};
47

58
use crate::io::AssetSourceBuilder;
69

10+
/// Private resource to store the temporary directory used by `temp://`.
11+
/// Kept private as it should only be removed on application exit.
712
#[derive(Resource)]
8-
struct TempAssetDirectory {
9-
folder: TempDirectory,
10-
}
11-
12-
impl TempAssetDirectory {
13-
fn path(&self) -> &Path {
14-
self.folder.path()
15-
}
16-
}
17-
1813
enum TempDirectory {
14+
/// Uses [`TempDir`](tempfile::TempDir)'s drop behaviour to delete the directory.
15+
/// Note that this is not _guaranteed_ to succeed, so it is possible to leak files from this
16+
/// option until the underlying OS cleans temporary directories. For secure files, consider using
17+
/// [`tempfile`](tempfile::tempfile) directly.
1918
Delete(tempfile::TempDir),
19+
/// Will not delete the temporary directory on exit, leaving cleanup the responsibility of
20+
/// the user or their system.
2021
Persist(PathBuf),
2122
}
2223

@@ -32,17 +33,24 @@ impl TempDirectory {
3233
pub(crate) fn get_temp_source(
3334
world: &mut World,
3435
temporary_file_path: Option<String>,
35-
) -> AssetSourceBuilder {
36-
let temp_dir = world.get_resource_or_insert_with::<TempAssetDirectory>(|| {
37-
let folder = match temporary_file_path {
36+
) -> std::io::Result<AssetSourceBuilder> {
37+
let temp_dir = match world.remove_resource::<TempDirectory>() {
38+
Some(resource) => resource,
39+
None => match temporary_file_path {
3840
Some(path) => TempDirectory::Persist(path.into()),
39-
None => TempDirectory::Delete(tempfile::tempdir().expect("todo")),
40-
};
41+
None => TempDirectory::Delete(tempfile::tempdir()?),
42+
},
43+
};
44+
45+
let path = temp_dir
46+
.path()
47+
.as_os_str()
48+
.try_into()
49+
.map_err(|error| Error::new(ErrorKind::InvalidData, error))?;
4150

42-
TempAssetDirectory { folder }
43-
});
51+
let source = AssetSourceBuilder::platform_default(path, None);
4452

45-
let path = temp_dir.path().to_str().expect("todo");
53+
world.insert_resource(temp_dir);
4654

47-
AssetSourceBuilder::platform_default(path, None)
55+
Ok(source)
4856
}

0 commit comments

Comments
 (0)