Skip to content

Commit ff466a3

Browse files
authored
Add weak_handle! convenience macro (#17384)
# Objective - A common bevy pattern is to pre-allocate a weak `Handle` with a static, random ID and fill it during `Plugin::build` via `load_internal_asset!` - This requires generating a random 128-bit number that is interpreted as a UUID. This is much less convenient than generating a UUID directly, and also, strictly speaking, error prone, since it often results in an invalid UUIDv4 – they have to follow the pattern `xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx`, where `x` is a random nibble (in practice this doesn't matter, since the UUID is just interpreted as a bag of bytes). ## Solution - Add a `weak_handle!` macro that internally calls [`uuid::uuid!`](https://docs.rs/uuid/1.12.0/uuid/macro.uuid.html) to parse a UUID from a string literal. - Now any random UUID generation tool can be used to generate an asset ID, such as `uuidgen` or entering "uuid" in DuckDuckGo. Previously: ```rust const SHADER: Handle<Shader> = Handle::weak_from_u128(314685653797097581405914117016993910609); ``` After this PR: ```rust const SHADER: Handle<Shader> = weak_handle!("1347c9b7-c46a-48e7-b7b8-023a354b7cac"); ``` Note that I did not yet migrate any of the existing uses. I can do that if desired, but want to have some feedback first to avoid wasted effort. ## Testing Tested via the included doctest.
1 parent 03ec644 commit ff466a3

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

crates/bevy_asset/src/handle.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,24 @@ impl<A: Asset> TryFrom<UntypedHandle> for Handle<A> {
501501
}
502502
}
503503

504+
/// Creates a weak [`Handle`] from a string literal containing a UUID.
505+
///
506+
/// # Examples
507+
///
508+
/// ```
509+
/// # use bevy_asset::{Handle, weak_handle};
510+
/// # type Shader = ();
511+
/// const SHADER: Handle<Shader> = weak_handle!("1347c9b7-c46a-48e7-b7b8-023a354b7cac");
512+
/// ```
513+
#[macro_export]
514+
macro_rules! weak_handle {
515+
($uuid:expr) => {{
516+
$crate::Handle::Weak($crate::AssetId::Uuid {
517+
uuid: $crate::uuid::uuid!($uuid),
518+
})
519+
}};
520+
}
521+
504522
/// Errors preventing the conversion of to/from an [`UntypedHandle`] and a [`Handle`].
505523
#[derive(Error, Debug, PartialEq, Clone)]
506524
#[non_exhaustive]

crates/bevy_asset/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ pub use server::*;
202202

203203
/// Rusty Object Notation, a crate used to serialize and deserialize bevy assets.
204204
pub use ron;
205+
pub use uuid;
205206

206207
use crate::{
207208
io::{embedded::EmbeddedAssetRegistry, AssetSourceBuilder, AssetSourceBuilders, AssetSourceId},

0 commit comments

Comments
 (0)