From 72c32129a2fda8a1ba22b5b98fd9f15c94fca0ec Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Thu, 6 May 2021 11:05:48 +0200 Subject: [PATCH 01/10] Add file metadata to AssetIo --- crates/bevy_asset/src/io/android_asset_io.rs | 14 ++++- crates/bevy_asset/src/io/file_asset_io.rs | 16 +++++- crates/bevy_asset/src/io/metadata.rs | 58 ++++++++++++++++++++ crates/bevy_asset/src/io/mod.rs | 18 +++++- crates/bevy_asset/src/io/wasm_asset_io.rs | 16 +++++- examples/asset/custom_asset_io.rs | 12 ++-- 6 files changed, 119 insertions(+), 15 deletions(-) create mode 100644 crates/bevy_asset/src/io/metadata.rs diff --git a/crates/bevy_asset/src/io/android_asset_io.rs b/crates/bevy_asset/src/io/android_asset_io.rs index 4397dcae63cfd..796f514c3511e 100644 --- a/crates/bevy_asset/src/io/android_asset_io.rs +++ b/crates/bevy_asset/src/io/android_asset_io.rs @@ -46,7 +46,17 @@ impl AssetIo for AndroidAssetIo { Ok(()) } - fn is_directory(&self, path: &Path) -> bool { - self.root_path.join(path).is_dir() + fn get_metadata(&self, path: &Path) -> Result { + let full_path = self.root_path.join(path); + full_path + .metadata() + .map(|metadata| metadata.into()) + .map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + AssetIoError::NotFound(full_path) + } else { + e.into() + } + }) } } diff --git a/crates/bevy_asset/src/io/file_asset_io.rs b/crates/bevy_asset/src/io/file_asset_io.rs index 1b5b1630b24c2..5a91aa5c457fc 100644 --- a/crates/bevy_asset/src/io/file_asset_io.rs +++ b/crates/bevy_asset/src/io/file_asset_io.rs @@ -1,6 +1,6 @@ #[cfg(feature = "filesystem_watcher")] use crate::{filesystem_watcher::FilesystemWatcher, AssetServer}; -use crate::{AssetIo, AssetIoError}; +use crate::{AssetIo, AssetIoError, Metadata}; use anyhow::Result; #[cfg(feature = "filesystem_watcher")] use bevy_ecs::system::Res; @@ -128,8 +128,18 @@ impl AssetIo for FileAssetIo { Ok(()) } - fn is_directory(&self, path: &Path) -> bool { - self.root_path.join(path).is_dir() + fn get_metadata(&self, path: &Path) -> Result { + let full_path = self.root_path.join(path); + full_path + .metadata() + .map(|metadata| metadata.into()) + .map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + AssetIoError::NotFound(full_path) + } else { + e.into() + } + }) } } diff --git a/crates/bevy_asset/src/io/metadata.rs b/crates/bevy_asset/src/io/metadata.rs new file mode 100644 index 0000000000000..9a9034f738d8f --- /dev/null +++ b/crates/bevy_asset/src/io/metadata.rs @@ -0,0 +1,58 @@ +/// A enum representing a type of file. +#[derive(Copy, Clone, Debug, PartialEq)] +pub enum FileType { + Directory, + File, + // To be compatible with [`std::fs::FileType`]. + Symlink, +} + +impl FileType { + pub fn is_directory(&self) -> bool { + *self == Self::Directory + } + + pub fn is_file(&self) -> bool { + *self == Self::File + } +} + +impl From for FileType { + fn from(file_type: std::fs::FileType) -> Self { + if file_type.is_dir() { + Self::Directory + } else if file_type.is_file() { + Self::File + } else if file_type.is_symlink() { + Self::Symlink + } else { + unreachable!() + } + } +} + +/// Metadata information about a file. +/// +/// This structure is returned from the [`AssetIo::get_metadata`] method. +#[derive(Debug)] +pub struct Metadata { + pub file_type: FileType, +} + +impl Metadata { + pub fn is_directory(&self) -> bool { + self.file_type.is_directory() + } + + pub fn is_file(&self) -> bool { + self.file_type.is_file() + } +} + +impl From for Metadata { + fn from(metadata: std::fs::Metadata) -> Self { + Self { + file_type: metadata.file_type().into(), + } + } +} diff --git a/crates/bevy_asset/src/io/mod.rs b/crates/bevy_asset/src/io/mod.rs index acff0ec013600..1df56acfbae2c 100644 --- a/crates/bevy_asset/src/io/mod.rs +++ b/crates/bevy_asset/src/io/mod.rs @@ -5,6 +5,8 @@ mod file_asset_io; #[cfg(target_arch = "wasm32")] mod wasm_asset_io; +mod metadata; + #[cfg(target_os = "android")] pub use android_asset_io::*; #[cfg(all(not(target_arch = "wasm32"), not(target_os = "android")))] @@ -12,6 +14,8 @@ pub use file_asset_io::*; #[cfg(target_arch = "wasm32")] pub use wasm_asset_io::*; +pub use metadata::*; + use anyhow::Result; use bevy_utils::BoxedFuture; use downcast_rs::{impl_downcast, Downcast}; @@ -39,9 +43,21 @@ pub trait AssetIo: Downcast + Send + Sync + 'static { &self, path: &Path, ) -> Result>, AssetIoError>; - fn is_directory(&self, path: &Path) -> bool; + fn get_metadata(&self, path: &Path) -> Result; fn watch_path_for_changes(&self, path: &Path) -> Result<(), AssetIoError>; fn watch_for_changes(&self) -> Result<(), AssetIoError>; + + fn is_directory(&self, path: &Path) -> bool { + self.get_metadata(path) + .map(|metadata| metadata.is_directory()) + .unwrap_or(false) + } + + fn is_file(&self, path: &Path) -> bool { + self.get_metadata(path) + .map(|metadata| metadata.is_file()) + .unwrap_or(false) + } } impl_downcast!(AssetIo); diff --git a/crates/bevy_asset/src/io/wasm_asset_io.rs b/crates/bevy_asset/src/io/wasm_asset_io.rs index a4e260d6fee43..1df0b2155f1a1 100644 --- a/crates/bevy_asset/src/io/wasm_asset_io.rs +++ b/crates/bevy_asset/src/io/wasm_asset_io.rs @@ -49,8 +49,18 @@ impl AssetIo for WasmAssetIo { bevy_log::warn!("Watching for changes is not supported in WASM"); Ok(()) } - - fn is_directory(&self, path: &Path) -> bool { - self.root_path.join(path).is_dir() + + fn get_metadata(&self, path: &Path) -> Result { + let full_path = self.root_path.join(path); + full_path + .metadata() + .map(|metadata| metadata.into()) + .map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + AssetIoError::NotFound(full_path) + } else { + e.into() + } + }) } } diff --git a/examples/asset/custom_asset_io.rs b/examples/asset/custom_asset_io.rs index 941cee61f721d..af74a93d2ba3e 100644 --- a/examples/asset/custom_asset_io.rs +++ b/examples/asset/custom_asset_io.rs @@ -1,5 +1,5 @@ use bevy::{ - asset::{AssetIo, AssetIoError}, + asset::{AssetIo, AssetIoError, Metadata}, prelude::*, utils::BoxedFuture, }; @@ -26,11 +26,6 @@ impl AssetIo for CustomAssetIo { self.0.read_directory(path) } - fn is_directory(&self, path: &Path) -> bool { - info!("is_directory({:?})", path); - self.0.is_directory(path) - } - fn watch_path_for_changes(&self, path: &Path) -> Result<(), AssetIoError> { info!("watch_path_for_changes({:?})", path); self.0.watch_path_for_changes(path) @@ -40,6 +35,11 @@ impl AssetIo for CustomAssetIo { info!("watch_for_changes()"); self.0.watch_for_changes() } + + fn get_metadata(&self, path: &Path) -> Result { + info!("get_metadata({:?})", path); + self.0.get_metadata(path) + } } /// A plugin used to execute the override of the asset io From a75625dc652a4744bd8ae84cc8f223c7e420376a Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Thu, 6 May 2021 11:45:41 +0200 Subject: [PATCH 02/10] add an asset_io accessor method to AssetServer and LoadContext --- crates/bevy_asset/src/asset_server.rs | 4 ++++ crates/bevy_asset/src/loader.rs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index c7159f146d402..0a8133dcb39c1 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -556,6 +556,10 @@ impl AssetServer { } } } + + pub fn asset_io(&self) -> &dyn AssetIo { + &*self.server.asset_io + } } fn free_unused_assets_system_impl(asset_server: &AssetServer) { diff --git a/crates/bevy_asset/src/loader.rs b/crates/bevy_asset/src/loader.rs index ac68f3c6d0c6a..5a5de9b8c11eb 100644 --- a/crates/bevy_asset/src/loader.rs +++ b/crates/bevy_asset/src/loader.rs @@ -147,6 +147,10 @@ impl<'a> LoadContext<'a> { pub fn task_pool(&self) -> &TaskPool { self.task_pool } + + pub fn asset_io(&self) -> &dyn AssetIo { + self.asset_io + } } /// The result of loading an asset of type `T` From 8cea08c7289685d2bc7f039df3a98527d1b332a9 Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Fri, 7 May 2021 09:35:45 +0200 Subject: [PATCH 03/10] apply suggestions --- crates/bevy_asset/src/asset_server.rs | 4 ++-- crates/bevy_asset/src/io/android_asset_io.rs | 19 ++++++++---------- crates/bevy_asset/src/io/file_asset_io.rs | 17 +++++++--------- crates/bevy_asset/src/io/metadata.rs | 18 ++++++++--------- crates/bevy_asset/src/io/mod.rs | 8 +++++--- crates/bevy_asset/src/io/wasm_asset_io.rs | 21 +++++++++----------- 6 files changed, 40 insertions(+), 47 deletions(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index 0a8133dcb39c1..64b1bb254c7aa 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -410,7 +410,7 @@ impl AssetServer { path: P, ) -> Result, AssetServerError> { let path = path.as_ref(); - if !self.server.asset_io.is_directory(path) { + if !self.server.asset_io.is_dir(path) { return Err(AssetServerError::AssetFolderNotADirectory( path.to_str().unwrap().to_string(), )); @@ -418,7 +418,7 @@ impl AssetServer { let mut handles = Vec::new(); for child_path in self.server.asset_io.read_directory(path.as_ref())? { - if self.server.asset_io.is_directory(&child_path) { + if self.server.asset_io.is_dir(&child_path) { handles.extend(self.load_folder(&child_path)?); } else { if self.get_path_asset_loader(&child_path).is_err() { diff --git a/crates/bevy_asset/src/io/android_asset_io.rs b/crates/bevy_asset/src/io/android_asset_io.rs index 796f514c3511e..249bf8caa8f43 100644 --- a/crates/bevy_asset/src/io/android_asset_io.rs +++ b/crates/bevy_asset/src/io/android_asset_io.rs @@ -1,4 +1,4 @@ -use crate::{AssetIo, AssetIoError}; +use crate::{AssetIo, AssetIoError, Metadata}; use anyhow::Result; use bevy_utils::BoxedFuture; use std::{ @@ -48,15 +48,12 @@ impl AssetIo for AndroidAssetIo { fn get_metadata(&self, path: &Path) -> Result { let full_path = self.root_path.join(path); - full_path - .metadata() - .map(|metadata| metadata.into()) - .map_err(|e| { - if e.kind() == std::io::ErrorKind::NotFound { - AssetIoError::NotFound(full_path) - } else { - e.into() - } - }) + full_path.metadata().map(Metadata::from).map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + AssetIoError::NotFound(full_path) + } else { + e.into() + } + }) } } diff --git a/crates/bevy_asset/src/io/file_asset_io.rs b/crates/bevy_asset/src/io/file_asset_io.rs index 5a91aa5c457fc..60e2aebfdfb47 100644 --- a/crates/bevy_asset/src/io/file_asset_io.rs +++ b/crates/bevy_asset/src/io/file_asset_io.rs @@ -130,16 +130,13 @@ impl AssetIo for FileAssetIo { fn get_metadata(&self, path: &Path) -> Result { let full_path = self.root_path.join(path); - full_path - .metadata() - .map(|metadata| metadata.into()) - .map_err(|e| { - if e.kind() == std::io::ErrorKind::NotFound { - AssetIoError::NotFound(full_path) - } else { - e.into() - } - }) + full_path.metadata().map(Metadata::from).map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + AssetIoError::NotFound(full_path) + } else { + e.into() + } + }) } } diff --git a/crates/bevy_asset/src/io/metadata.rs b/crates/bevy_asset/src/io/metadata.rs index 9a9034f738d8f..cce61237fd7bb 100644 --- a/crates/bevy_asset/src/io/metadata.rs +++ b/crates/bevy_asset/src/io/metadata.rs @@ -1,5 +1,5 @@ /// A enum representing a type of file. -#[derive(Copy, Clone, Debug, PartialEq)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] pub enum FileType { Directory, File, @@ -8,12 +8,12 @@ pub enum FileType { } impl FileType { - pub fn is_directory(&self) -> bool { - *self == Self::Directory + pub const fn is_dir(&self) -> bool { + (*self as isize) == (Self::Directory as isize) } - pub fn is_file(&self) -> bool { - *self == Self::File + pub const fn is_file(&self) -> bool { + (*self as isize) == (Self::File as isize) } } @@ -34,17 +34,17 @@ impl From for FileType { /// Metadata information about a file. /// /// This structure is returned from the [`AssetIo::get_metadata`] method. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Metadata { pub file_type: FileType, } impl Metadata { - pub fn is_directory(&self) -> bool { - self.file_type.is_directory() + pub const fn is_dir(&self) -> bool { + self.file_type.is_dir() } - pub fn is_file(&self) -> bool { + pub const fn is_file(&self) -> bool { self.file_type.is_file() } } diff --git a/crates/bevy_asset/src/io/mod.rs b/crates/bevy_asset/src/io/mod.rs index 1df56acfbae2c..e3d3e24047703 100644 --- a/crates/bevy_asset/src/io/mod.rs +++ b/crates/bevy_asset/src/io/mod.rs @@ -47,15 +47,17 @@ pub trait AssetIo: Downcast + Send + Sync + 'static { fn watch_path_for_changes(&self, path: &Path) -> Result<(), AssetIoError>; fn watch_for_changes(&self) -> Result<(), AssetIoError>; - fn is_directory(&self, path: &Path) -> bool { + fn is_dir(&self, path: &Path) -> bool { self.get_metadata(path) - .map(|metadata| metadata.is_directory()) + .as_ref() + .map(Metadata::is_dir) .unwrap_or(false) } fn is_file(&self, path: &Path) -> bool { self.get_metadata(path) - .map(|metadata| metadata.is_file()) + .as_ref() + .map(Metadata::is_file) .unwrap_or(false) } } diff --git a/crates/bevy_asset/src/io/wasm_asset_io.rs b/crates/bevy_asset/src/io/wasm_asset_io.rs index 1df0b2155f1a1..9a5437fb0dde8 100644 --- a/crates/bevy_asset/src/io/wasm_asset_io.rs +++ b/crates/bevy_asset/src/io/wasm_asset_io.rs @@ -1,4 +1,4 @@ -use crate::{AssetIo, AssetIoError}; +use crate::{AssetIo, AssetIoError, Metadata}; use anyhow::Result; use bevy_utils::BoxedFuture; use js_sys::Uint8Array; @@ -49,18 +49,15 @@ impl AssetIo for WasmAssetIo { bevy_log::warn!("Watching for changes is not supported in WASM"); Ok(()) } - + fn get_metadata(&self, path: &Path) -> Result { let full_path = self.root_path.join(path); - full_path - .metadata() - .map(|metadata| metadata.into()) - .map_err(|e| { - if e.kind() == std::io::ErrorKind::NotFound { - AssetIoError::NotFound(full_path) - } else { - e.into() - } - }) + full_path.metadata().map(Metadata::from).map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + AssetIoError::NotFound(full_path) + } else { + e.into() + } + }) } } From 2d4ec13e3f53410ec2820c6eebe0aa8c8de72ce7 Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Sat, 8 May 2021 20:29:49 +0200 Subject: [PATCH 04/10] remove symlink file type and use TryFrom --- crates/bevy_asset/src/io/android_asset_io.rs | 18 +++++++---- crates/bevy_asset/src/io/file_asset_io.rs | 18 +++++++---- crates/bevy_asset/src/io/metadata.rs | 34 ++++++++++++-------- crates/bevy_asset/src/io/wasm_asset_io.rs | 22 ++++++++----- 4 files changed, 56 insertions(+), 36 deletions(-) diff --git a/crates/bevy_asset/src/io/android_asset_io.rs b/crates/bevy_asset/src/io/android_asset_io.rs index 249bf8caa8f43..fc049b77a91a6 100644 --- a/crates/bevy_asset/src/io/android_asset_io.rs +++ b/crates/bevy_asset/src/io/android_asset_io.rs @@ -2,6 +2,7 @@ use crate::{AssetIo, AssetIoError, Metadata}; use anyhow::Result; use bevy_utils::BoxedFuture; use std::{ + convert::TryFrom, ffi::CString, path::{Path, PathBuf}, }; @@ -48,12 +49,15 @@ impl AssetIo for AndroidAssetIo { fn get_metadata(&self, path: &Path) -> Result { let full_path = self.root_path.join(path); - full_path.metadata().map(Metadata::from).map_err(|e| { - if e.kind() == std::io::ErrorKind::NotFound { - AssetIoError::NotFound(full_path) - } else { - e.into() - } - }) + full_path + .metadata() + .and_then(Metadata::try_from) + .map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + AssetIoError::NotFound(full_path) + } else { + e.into() + } + }) } } diff --git a/crates/bevy_asset/src/io/file_asset_io.rs b/crates/bevy_asset/src/io/file_asset_io.rs index 60e2aebfdfb47..14dcf0a153a92 100644 --- a/crates/bevy_asset/src/io/file_asset_io.rs +++ b/crates/bevy_asset/src/io/file_asset_io.rs @@ -15,6 +15,7 @@ use parking_lot::RwLock; #[cfg(feature = "filesystem_watcher")] use std::sync::Arc; use std::{ + convert::TryFrom, env, fs, io::Read, path::{Path, PathBuf}, @@ -130,13 +131,16 @@ impl AssetIo for FileAssetIo { fn get_metadata(&self, path: &Path) -> Result { let full_path = self.root_path.join(path); - full_path.metadata().map(Metadata::from).map_err(|e| { - if e.kind() == std::io::ErrorKind::NotFound { - AssetIoError::NotFound(full_path) - } else { - e.into() - } - }) + full_path + .metadata() + .and_then(Metadata::try_from) + .map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + AssetIoError::NotFound(full_path) + } else { + e.into() + } + }) } } diff --git a/crates/bevy_asset/src/io/metadata.rs b/crates/bevy_asset/src/io/metadata.rs index cce61237fd7bb..c67419d977f9d 100644 --- a/crates/bevy_asset/src/io/metadata.rs +++ b/crates/bevy_asset/src/io/metadata.rs @@ -1,10 +1,11 @@ +use std::convert::{TryFrom, TryInto}; + /// A enum representing a type of file. +#[non_exhaustive] #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] pub enum FileType { Directory, File, - // To be compatible with [`std::fs::FileType`]. - Symlink, } impl FileType { @@ -17,16 +18,19 @@ impl FileType { } } -impl From for FileType { - fn from(file_type: std::fs::FileType) -> Self { +impl TryFrom for FileType { + type Error = std::io::Error; + + fn try_from(file_type: std::fs::FileType) -> Result { if file_type.is_dir() { - Self::Directory + Ok(Self::Directory) } else if file_type.is_file() { - Self::File - } else if file_type.is_symlink() { - Self::Symlink + Ok(Self::File) } else { - unreachable!() + Err(std::io::Error::new( + std::io::ErrorKind::Other, + "unknown file type", + )) } } } @@ -49,10 +53,12 @@ impl Metadata { } } -impl From for Metadata { - fn from(metadata: std::fs::Metadata) -> Self { - Self { - file_type: metadata.file_type().into(), - } +impl TryFrom for Metadata { + type Error = std::io::Error; + + fn try_from(metadata: std::fs::Metadata) -> Result { + Ok(Self { + file_type: metadata.file_type().try_into()?, + }) } } diff --git a/crates/bevy_asset/src/io/wasm_asset_io.rs b/crates/bevy_asset/src/io/wasm_asset_io.rs index 9a5437fb0dde8..4e0d812738d6f 100644 --- a/crates/bevy_asset/src/io/wasm_asset_io.rs +++ b/crates/bevy_asset/src/io/wasm_asset_io.rs @@ -2,7 +2,10 @@ use crate::{AssetIo, AssetIoError, Metadata}; use anyhow::Result; use bevy_utils::BoxedFuture; use js_sys::Uint8Array; -use std::path::{Path, PathBuf}; +use std::{ + convert::TryFrom, + path::{Path, PathBuf}, +}; use wasm_bindgen::JsCast; use wasm_bindgen_futures::JsFuture; use web_sys::Response; @@ -52,12 +55,15 @@ impl AssetIo for WasmAssetIo { fn get_metadata(&self, path: &Path) -> Result { let full_path = self.root_path.join(path); - full_path.metadata().map(Metadata::from).map_err(|e| { - if e.kind() == std::io::ErrorKind::NotFound { - AssetIoError::NotFound(full_path) - } else { - e.into() - } - }) + full_path + .metadata() + .and_then(Metadata::try_from) + .map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + AssetIoError::NotFound(full_path) + } else { + e.into() + } + }) } } From 4a31f7d0cd3071031d57619b50b077ce5b049996 Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Sun, 9 May 2021 17:10:47 +0200 Subject: [PATCH 05/10] use matches macro --- crates/bevy_asset/src/io/metadata.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_asset/src/io/metadata.rs b/crates/bevy_asset/src/io/metadata.rs index c67419d977f9d..95120ca2f890b 100644 --- a/crates/bevy_asset/src/io/metadata.rs +++ b/crates/bevy_asset/src/io/metadata.rs @@ -10,11 +10,11 @@ pub enum FileType { impl FileType { pub const fn is_dir(&self) -> bool { - (*self as isize) == (Self::Directory as isize) + matches!(self, Self::Directory) } pub const fn is_file(&self) -> bool { - (*self as isize) == (Self::File as isize) + matches!(self, Self::File) } } From b4f613778ba0e0af79fcc54ef23f728b37783e30 Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Tue, 11 May 2021 08:49:12 +0200 Subject: [PATCH 06/10] Use asset_io method in asset server --- crates/bevy_asset/src/asset_server.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index 64b1bb254c7aa..0285c101ee863 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -131,7 +131,7 @@ impl AssetServer { /// Enable watching of the filesystem for changes, if support is available, starting from after /// the point of calling this function. pub fn watch_for_changes(&self) -> Result<(), AssetServerError> { - self.server.asset_io.watch_for_changes()?; + self.asset_io().watch_for_changes()?; Ok(()) } @@ -308,7 +308,7 @@ impl AssetServer { }; // load the asset bytes - let bytes = match self.server.asset_io.load_path(asset_path.path()).await { + let bytes = match self.asset_io().load_path(asset_path.path()).await { Ok(bytes) => bytes, Err(err) => { set_asset_failed(); @@ -320,7 +320,7 @@ impl AssetServer { let mut load_context = LoadContext::new( asset_path.path(), &self.server.asset_ref_counter.channel, - &*self.server.asset_io, + self.asset_io(), version, &self.server.task_pool, ); @@ -368,8 +368,7 @@ impl AssetServer { } } - self.server - .asset_io + self.asset_io() .watch_path_for_changes(asset_path.path()) .unwrap(); self.create_assets_in_load_context(&mut load_context); @@ -410,15 +409,15 @@ impl AssetServer { path: P, ) -> Result, AssetServerError> { let path = path.as_ref(); - if !self.server.asset_io.is_dir(path) { + if !self.asset_io().is_dir(path) { return Err(AssetServerError::AssetFolderNotADirectory( path.to_str().unwrap().to_string(), )); } let mut handles = Vec::new(); - for child_path in self.server.asset_io.read_directory(path.as_ref())? { - if self.server.asset_io.is_dir(&child_path) { + for child_path in self.asset_io().read_directory(path.as_ref())? { + if self.asset_io().is_dir(&child_path) { handles.extend(self.load_folder(&child_path)?); } else { if self.get_path_asset_loader(&child_path).is_err() { From 333b3abe927dc17f0db5e51e05e4ff4ce3bbd5b3 Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Thu, 20 May 2021 14:18:01 +0200 Subject: [PATCH 07/10] inline metadata methods --- crates/bevy_asset/src/io/metadata.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/bevy_asset/src/io/metadata.rs b/crates/bevy_asset/src/io/metadata.rs index 95120ca2f890b..a2dd63358281b 100644 --- a/crates/bevy_asset/src/io/metadata.rs +++ b/crates/bevy_asset/src/io/metadata.rs @@ -9,10 +9,12 @@ pub enum FileType { } impl FileType { + #[inline] pub const fn is_dir(&self) -> bool { matches!(self, Self::Directory) } + #[inline] pub const fn is_file(&self) -> bool { matches!(self, Self::File) } @@ -44,10 +46,12 @@ pub struct Metadata { } impl Metadata { + #[inline] pub const fn is_dir(&self) -> bool { self.file_type.is_dir() } + #[inline] pub const fn is_file(&self) -> bool { self.file_type.is_file() } From 869fbe443449593f43112fa9b3b09524fd23c72d Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Tue, 8 Jun 2021 09:29:40 +0200 Subject: [PATCH 08/10] private file_type --- crates/bevy_asset/src/io/metadata.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/crates/bevy_asset/src/io/metadata.rs b/crates/bevy_asset/src/io/metadata.rs index a2dd63358281b..b8ef43e44e5e5 100644 --- a/crates/bevy_asset/src/io/metadata.rs +++ b/crates/bevy_asset/src/io/metadata.rs @@ -42,10 +42,19 @@ impl TryFrom for FileType { /// This structure is returned from the [`AssetIo::get_metadata`] method. #[derive(Debug, Clone)] pub struct Metadata { - pub file_type: FileType, + file_type: FileType, } impl Metadata { + pub fn new(file_type: FileType) -> Self { + Self { file_type } + } + + #[inline] + pub const fn file_type(&self) -> FileType { + self.file_type + } + #[inline] pub const fn is_dir(&self) -> bool { self.file_type.is_dir() From addb4473098e2f51fa3604acfcac80032eb08c53 Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Thu, 10 Feb 2022 13:45:20 +0100 Subject: [PATCH 09/10] fix doc --- crates/bevy_asset/src/io/metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_asset/src/io/metadata.rs b/crates/bevy_asset/src/io/metadata.rs index b8ef43e44e5e5..67158a1ccfd1c 100644 --- a/crates/bevy_asset/src/io/metadata.rs +++ b/crates/bevy_asset/src/io/metadata.rs @@ -39,7 +39,7 @@ impl TryFrom for FileType { /// Metadata information about a file. /// -/// This structure is returned from the [`AssetIo::get_metadata`] method. +/// This structure is returned from the [`AssetIo::get_metadata`](crate::AssetIo) method. #[derive(Debug, Clone)] pub struct Metadata { file_type: FileType, From 47809b198641d73cc5f4a0e5b07f209cbac2f479 Mon Sep 17 00:00:00 2001 From: Johannes Hackel Date: Sun, 10 Apr 2022 14:56:43 +0200 Subject: [PATCH 10/10] remove duplicate method --- crates/bevy_asset/src/asset_server.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index 0285c101ee863..3097ad35302ee 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -555,10 +555,6 @@ impl AssetServer { } } } - - pub fn asset_io(&self) -> &dyn AssetIo { - &*self.server.asset_io - } } fn free_unused_assets_system_impl(asset_server: &AssetServer) {