Skip to content

Commit 8384be5

Browse files
committed
Allow SavedAssetBuilder::labeled_assets to store owned strings.
1 parent 6ea5454 commit 8384be5

File tree

2 files changed

+37
-32
lines changed

2 files changed

+37
-32
lines changed

crates/bevy_asset/src/saver.rs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ impl<S: AssetSaver> ErasedAssetSaver for S {
8686
#[derive(Clone)]
8787
pub struct SavedAsset<'a, 'b, A: Asset> {
8888
value: &'a A,
89-
labeled_assets: Moo<'b, HashMap<&'a str, LabeledSavedAsset<'a>>>,
89+
labeled_assets: Moo<'b, HashMap<CowArc<'a, str>, LabeledSavedAsset<'a>>>,
9090
}
9191

9292
impl<A: Asset> Deref for SavedAsset<'_, '_, A> {
@@ -100,7 +100,7 @@ impl<A: Asset> Deref for SavedAsset<'_, '_, A> {
100100
impl<'a, 'b, A: Asset> SavedAsset<'a, 'b, A> {
101101
fn from_value_and_labeled_saved_assets(
102102
value: &'a A,
103-
labeled_saved_assets: &'b HashMap<&'a str, LabeledSavedAsset<'a>>,
103+
labeled_saved_assets: &'b HashMap<CowArc<'a, str>, LabeledSavedAsset<'a>>,
104104
) -> Self {
105105
Self {
106106
value,
@@ -119,7 +119,7 @@ impl<'a, 'b, A: Asset> SavedAsset<'a, 'b, A> {
119119
.iter()
120120
.map(|(label, labeled_asset)| {
121121
(
122-
label.borrow(),
122+
CowArc::Borrowed(label.borrow()),
123123
LabeledSavedAsset::from_labeled_asset(labeled_asset),
124124
)
125125
})
@@ -203,7 +203,7 @@ impl<'a, 'b, A: Asset> SavedAsset<'a, 'b, A> {
203203
#[derive(Clone)]
204204
pub struct ErasedSavedAsset<'a: 'b, 'b> {
205205
value: &'a dyn AssetContainer,
206-
labeled_assets: Moo<'b, HashMap<&'a str, LabeledSavedAsset<'a>>>,
206+
labeled_assets: Moo<'b, HashMap<CowArc<'a, str>, LabeledSavedAsset<'a>>>,
207207
}
208208

209209
impl<'a> ErasedSavedAsset<'a, '_> {
@@ -215,7 +215,10 @@ impl<'a> ErasedSavedAsset<'a, '_> {
215215
.labeled_assets
216216
.iter()
217217
.map(|(label, asset)| {
218-
(label.borrow(), LabeledSavedAsset::from_labeled_asset(asset))
218+
(
219+
CowArc::Borrowed(label.borrow()),
220+
LabeledSavedAsset::from_labeled_asset(asset),
221+
)
219222
})
220223
.collect(),
221224
),
@@ -261,7 +264,7 @@ impl<'a> LabeledSavedAsset<'a> {
261264
/// This is commonly used in tandem with [`save_using_saver`].
262265
pub struct SavedAssetBuilder<'a> {
263266
/// The labeled assets for this saved asset.
264-
labeled_assets: HashMap<&'a str, LabeledSavedAsset<'a>>,
267+
labeled_assets: HashMap<CowArc<'a, str>, LabeledSavedAsset<'a>>,
265268
/// The asset path (with no label) that this saved asset is "tied" to.
266269
///
267270
/// All labeled assets will use this asset path (with their substituted labels). Note labeled
@@ -288,11 +291,12 @@ impl<'a> SavedAssetBuilder<'a> {
288291
/// an asset).
289292
///
290293
/// This is primarily used when **constructing** a new asset to be saved.
291-
pub fn add_labeled_asset_with_new_handle<A: Asset>(
294+
pub fn add_labeled_asset_with_new_handle<'b: 'a, A: Asset>(
292295
&mut self,
293-
label: &'a str,
296+
label: impl Into<CowArc<'b, str>>,
294297
asset: SavedAsset<'a, 'a, A>,
295298
) -> Handle<A> {
299+
let label = label.into();
296300
let handle = Handle::Strong(
297301
self.asset_server
298302
.read_infos()
@@ -313,22 +317,27 @@ impl<'a> SavedAssetBuilder<'a> {
313317
///
314318
/// This is primarily used when attempting to save an existing asset (which already has its
315319
/// handles populated).
316-
pub fn add_labeled_asset_with_existing_handle<A: Asset>(
320+
pub fn add_labeled_asset_with_existing_handle<'b: 'a, A: Asset>(
317321
&mut self,
318-
label: &'a str,
322+
label: impl Into<CowArc<'b, str>>,
319323
asset: SavedAsset<'a, 'a, A>,
320324
handle: Handle<A>,
321325
) {
322-
self.add_labeled_asset_with_existing_handle_erased(label, asset.upcast(), handle.untyped());
326+
self.add_labeled_asset_with_existing_handle_erased(
327+
label.into(),
328+
asset.upcast(),
329+
handle.untyped(),
330+
);
323331
}
324332

325333
/// Same as [`Self::add_labeled_asset_with_new_handle`], but type-erased to allow for dynamic
326334
/// types.
327-
pub fn add_labeled_asset_with_new_handle_erased(
335+
pub fn add_labeled_asset_with_new_handle_erased<'b: 'a>(
328336
&mut self,
329-
label: &'a str,
337+
label: impl Into<CowArc<'b, str>>,
330338
asset: ErasedSavedAsset<'a, 'a>,
331339
) -> UntypedHandle {
340+
let label = label.into();
332341
let handle = UntypedHandle::Strong(
333342
self.asset_server
334343
.read_infos()
@@ -347,15 +356,15 @@ impl<'a> SavedAssetBuilder<'a> {
347356

348357
/// Same as [`Self::add_labeled_asset_with_existing_handle`], but type-erased to allow for
349358
/// dynamic types.
350-
pub fn add_labeled_asset_with_existing_handle_erased(
359+
pub fn add_labeled_asset_with_existing_handle_erased<'b: 'a>(
351360
&mut self,
352-
label: &'a str,
361+
label: impl Into<CowArc<'b, str>>,
353362
asset: ErasedSavedAsset<'a, 'a>,
354363
handle: UntypedHandle,
355364
) {
356365
// TODO: Check asset and handle have the same type.
357366
self.labeled_assets
358-
.insert(label, LabeledSavedAsset { asset, handle });
367+
.insert(label.into(), LabeledSavedAsset { asset, handle });
359368
}
360369

361370
/// Creates the final saved asset from this builder.
@@ -544,7 +553,7 @@ pub(crate) mod tests {
544553
let mut asset_labels = saved_asset
545554
.labeled_assets
546555
.keys()
547-
.copied()
556+
.map(|label| label.as_ref().to_string())
548557
.collect::<Vec<_>>();
549558
asset_labels.sort();
550559
assert_eq!(asset_labels, &["goodbye", "hiya", "idk"]);
@@ -634,7 +643,7 @@ pub(crate) mod tests {
634643
let mut asset_labels = saved_asset
635644
.labeled_assets
636645
.keys()
637-
.copied()
646+
.map(|label| label.as_ref().to_string())
638647
.collect::<Vec<_>>();
639648
asset_labels.sort();
640649
assert_eq!(asset_labels, &["goodbye", "hiya", "idk"]);

examples/asset/asset_saving.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,9 @@ fn perform_save(boxes: Query<(&Sprite, &Transform), With<Box>>, asset_server: Re
4949
// First we extract all the data needed to produce an asset we can save.
5050
let boxes = boxes
5151
.iter()
52-
.enumerate()
53-
.map(|(index, (sprite, transform))| {
54-
(
55-
index.to_string(),
56-
OneBox {
57-
position: transform.translation.xy(),
58-
color: sprite.color,
59-
},
60-
)
52+
.map(|(sprite, transform)| OneBox {
53+
position: transform.translation.xy(),
54+
color: sprite.color,
6155
})
6256
.collect::<Vec<_>>();
6357

@@ -67,11 +61,13 @@ fn perform_save(boxes: Query<(&Sprite, &Transform), With<Box>>, asset_server: Re
6761
// Build a `SavedAsset` instance from the boxes we extracted.
6862
let mut builder = SavedAssetBuilder::new(asset_server.clone(), ASSET_PATH.into());
6963
let mut many_boxes = ManyBoxes { boxes: vec![] };
70-
for (label, one_box) in boxes.iter() {
71-
many_boxes.boxes.push(
72-
builder
73-
.add_labeled_asset_with_new_handle(label, SavedAsset::from_asset(one_box)),
74-
);
64+
for (index, one_box) in boxes.iter().enumerate() {
65+
many_boxes
66+
.boxes
67+
.push(builder.add_labeled_asset_with_new_handle(
68+
index.to_string(),
69+
SavedAsset::from_asset(one_box),
70+
));
7571
}
7672

7773
let saved_asset = builder.build(&many_boxes);

0 commit comments

Comments
 (0)