Skip to content

Commit b6e154f

Browse files
authored
Fix embedded watcher to work with external crates (#11370)
# Objective Tried using "embedded_watcher" feature and `embedded_asset!()` from another crate. The assets embedded fine but were not "watched." The problem appears to be that checking for the feature was done inside the macro, so rather than checking if "embedded_watcher" was enabled for bevy, it would check if it was enabled for the current crate. ## Solution I extracted the checks for the "embedded_watcher" feature into its own function called `watched_path()`. No external changes. ### Alternative Solution An alternative fix would be to not do any feature checking in `embedded_asset!()` or an extracted function and always send the full_path to `insert_asset()` where it's promptly dropped when the feature isn't turned on. That would be simpler. ``` ($app: ident, $source_path: expr, $path: expr) => {{ let mut embedded = $app .world .resource_mut::<$crate::io::embedded::EmbeddedAssetRegistry>(); let path = $crate::embedded_path!($source_path, $path); //#[cfg(feature = "embedded_watcher")] let full_path = std::path::Path::new(file!()).parent().unwrap().join($path); //#[cfg(not(feature = "embedded_watcher"))] //let full_path = std::path::PathBuf::new(); embedded.insert_asset(full_path, &path, include_bytes!($path)); }}; ``` ## Changelog > Fix embedded_watcher feature to work with external crates
1 parent fcd7c0f commit b6e154f

File tree

1 file changed

+19
-5
lines changed
  • crates/bevy_asset/src/io/embedded

1 file changed

+19
-5
lines changed

crates/bevy_asset/src/io/embedded/mod.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,14 +199,28 @@ macro_rules! embedded_asset {
199199
.world
200200
.resource_mut::<$crate::io::embedded::EmbeddedAssetRegistry>();
201201
let path = $crate::embedded_path!($source_path, $path);
202-
#[cfg(feature = "embedded_watcher")]
203-
let full_path = std::path::Path::new(file!()).parent().unwrap().join($path);
204-
#[cfg(not(feature = "embedded_watcher"))]
205-
let full_path = std::path::PathBuf::new();
206-
embedded.insert_asset(full_path, &path, include_bytes!($path));
202+
let watched_path = $crate::io::embedded::watched_path(file!(), $path);
203+
embedded.insert_asset(watched_path, &path, include_bytes!($path));
207204
}};
208205
}
209206

207+
/// Returns the path used by the watcher.
208+
#[doc(hidden)]
209+
#[cfg(feature = "embedded_watcher")]
210+
pub fn watched_path(source_file_path: &'static str, asset_path: &'static str) -> PathBuf {
211+
PathBuf::from(source_file_path)
212+
.parent()
213+
.unwrap()
214+
.join(asset_path)
215+
}
216+
217+
/// Returns an empty PathBuf.
218+
#[doc(hidden)]
219+
#[cfg(not(feature = "embedded_watcher"))]
220+
pub fn watched_path(_source_file_path: &'static str, _asset_path: &'static str) -> PathBuf {
221+
PathBuf::from("")
222+
}
223+
210224
/// Loads an "internal" asset by embedding the string stored in the given `path_str` and associates it with the given handle.
211225
#[macro_export]
212226
macro_rules! load_internal_asset {

0 commit comments

Comments
 (0)