Skip to content

Commit e826439

Browse files
committed
Allow SavedAssetBuilder::labeled_assets to store owned strings.
1 parent 621f960 commit e826439

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
@@ -90,7 +90,7 @@ impl<S: AssetSaver> ErasedAssetSaver for S {
9090
#[derive(Clone)]
9191
pub struct SavedAsset<'a, 'b, A: Asset> {
9292
value: &'a A,
93-
labeled_assets: Moo<'b, HashMap<&'a str, LabeledSavedAsset<'a>>>,
93+
labeled_assets: Moo<'b, HashMap<CowArc<'a, str>, LabeledSavedAsset<'a>>>,
9494
}
9595

9696
impl<A: Asset> Deref for SavedAsset<'_, '_, A> {
@@ -104,7 +104,7 @@ impl<A: Asset> Deref for SavedAsset<'_, '_, A> {
104104
impl<'a, 'b, A: Asset> SavedAsset<'a, 'b, A> {
105105
fn from_value_and_labeled_saved_assets(
106106
value: &'a A,
107-
labeled_saved_assets: &'b HashMap<&'a str, LabeledSavedAsset<'a>>,
107+
labeled_saved_assets: &'b HashMap<CowArc<'a, str>, LabeledSavedAsset<'a>>,
108108
) -> Self {
109109
Self {
110110
value,
@@ -123,7 +123,7 @@ impl<'a, 'b, A: Asset> SavedAsset<'a, 'b, A> {
123123
.iter()
124124
.map(|(label, labeled_asset)| {
125125
(
126-
label.borrow(),
126+
CowArc::Borrowed(label.borrow()),
127127
LabeledSavedAsset::from_labeled_asset(labeled_asset),
128128
)
129129
})
@@ -207,7 +207,7 @@ impl<'a, 'b, A: Asset> SavedAsset<'a, 'b, A> {
207207
#[derive(Clone)]
208208
pub struct ErasedSavedAsset<'a: 'b, 'b> {
209209
value: &'a dyn AssetContainer,
210-
labeled_assets: Moo<'b, HashMap<&'a str, LabeledSavedAsset<'a>>>,
210+
labeled_assets: Moo<'b, HashMap<CowArc<'a, str>, LabeledSavedAsset<'a>>>,
211211
}
212212

213213
impl<'a> ErasedSavedAsset<'a, '_> {
@@ -219,7 +219,10 @@ impl<'a> ErasedSavedAsset<'a, '_> {
219219
.labeled_assets
220220
.iter()
221221
.map(|(label, asset)| {
222-
(label.borrow(), LabeledSavedAsset::from_labeled_asset(asset))
222+
(
223+
CowArc::Borrowed(label.borrow()),
224+
LabeledSavedAsset::from_labeled_asset(asset),
225+
)
223226
})
224227
.collect(),
225228
),
@@ -265,7 +268,7 @@ impl<'a> LabeledSavedAsset<'a> {
265268
/// This is commonly used in tandem with [`save_using_saver`].
266269
pub struct SavedAssetBuilder<'a> {
267270
/// The labeled assets for this saved asset.
268-
labeled_assets: HashMap<&'a str, LabeledSavedAsset<'a>>,
271+
labeled_assets: HashMap<CowArc<'a, str>, LabeledSavedAsset<'a>>,
269272
/// The asset path (with no label) that this saved asset is "tied" to.
270273
///
271274
/// All labeled assets will use this asset path (with their substituted labels). Note labeled
@@ -292,11 +295,12 @@ impl<'a> SavedAssetBuilder<'a> {
292295
/// an asset).
293296
///
294297
/// This is primarily used when **constructing** a new asset to be saved.
295-
pub fn add_labeled_asset_with_new_handle<A: Asset>(
298+
pub fn add_labeled_asset_with_new_handle<'b: 'a, A: Asset>(
296299
&mut self,
297-
label: &'a str,
300+
label: impl Into<CowArc<'b, str>>,
298301
asset: SavedAsset<'a, 'a, A>,
299302
) -> Handle<A> {
303+
let label = label.into();
300304
let handle = Handle::Strong(
301305
self.asset_server
302306
.read_infos()
@@ -317,22 +321,27 @@ impl<'a> SavedAssetBuilder<'a> {
317321
///
318322
/// This is primarily used when attempting to save an existing asset (which already has its
319323
/// handles populated).
320-
pub fn add_labeled_asset_with_existing_handle<A: Asset>(
324+
pub fn add_labeled_asset_with_existing_handle<'b: 'a, A: Asset>(
321325
&mut self,
322-
label: &'a str,
326+
label: impl Into<CowArc<'b, str>>,
323327
asset: SavedAsset<'a, 'a, A>,
324328
handle: Handle<A>,
325329
) {
326-
self.add_labeled_asset_with_existing_handle_erased(label, asset.upcast(), handle.untyped());
330+
self.add_labeled_asset_with_existing_handle_erased(
331+
label.into(),
332+
asset.upcast(),
333+
handle.untyped(),
334+
);
327335
}
328336

329337
/// Same as [`Self::add_labeled_asset_with_new_handle`], but type-erased to allow for dynamic
330338
/// types.
331-
pub fn add_labeled_asset_with_new_handle_erased(
339+
pub fn add_labeled_asset_with_new_handle_erased<'b: 'a>(
332340
&mut self,
333-
label: &'a str,
341+
label: impl Into<CowArc<'b, str>>,
334342
asset: ErasedSavedAsset<'a, 'a>,
335343
) -> UntypedHandle {
344+
let label = label.into();
336345
let handle = UntypedHandle::Strong(
337346
self.asset_server
338347
.read_infos()
@@ -351,15 +360,15 @@ impl<'a> SavedAssetBuilder<'a> {
351360

352361
/// Same as [`Self::add_labeled_asset_with_existing_handle`], but type-erased to allow for
353362
/// dynamic types.
354-
pub fn add_labeled_asset_with_existing_handle_erased(
363+
pub fn add_labeled_asset_with_existing_handle_erased<'b: 'a>(
355364
&mut self,
356-
label: &'a str,
365+
label: impl Into<CowArc<'b, str>>,
357366
asset: ErasedSavedAsset<'a, 'a>,
358367
handle: UntypedHandle,
359368
) {
360369
// TODO: Check asset and handle have the same type.
361370
self.labeled_assets
362-
.insert(label, LabeledSavedAsset { asset, handle });
371+
.insert(label.into(), LabeledSavedAsset { asset, handle });
363372
}
364373

365374
/// Creates the final saved asset from this builder.
@@ -548,7 +557,7 @@ pub(crate) mod tests {
548557
let mut asset_labels = saved_asset
549558
.labeled_assets
550559
.keys()
551-
.copied()
560+
.map(|label| label.as_ref().to_string())
552561
.collect::<Vec<_>>();
553562
asset_labels.sort();
554563
assert_eq!(asset_labels, &["goodbye", "hiya", "idk"]);
@@ -638,7 +647,7 @@ pub(crate) mod tests {
638647
let mut asset_labels = saved_asset
639648
.labeled_assets
640649
.keys()
641-
.copied()
650+
.map(|label| label.as_ref().to_string())
642651
.collect::<Vec<_>>();
643652
asset_labels.sort();
644653
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
@@ -45,15 +45,9 @@ fn perform_save(boxes: Query<(&Sprite, &Transform), With<Box>>, asset_server: Re
4545
// First we extract all the data needed to produce an asset we can save.
4646
let boxes = boxes
4747
.iter()
48-
.enumerate()
49-
.map(|(index, (sprite, transform))| {
50-
(
51-
index.to_string(),
52-
OneBox {
53-
position: transform.translation.xy(),
54-
color: sprite.color,
55-
},
56-
)
48+
.map(|(sprite, transform)| OneBox {
49+
position: transform.translation.xy(),
50+
color: sprite.color,
5751
})
5852
.collect::<Vec<_>>();
5953

@@ -63,11 +57,13 @@ fn perform_save(boxes: Query<(&Sprite, &Transform), With<Box>>, asset_server: Re
6357
// Build a `SavedAsset` instance from the boxes we extracted.
6458
let mut builder = SavedAssetBuilder::new(asset_server.clone(), ASSET_PATH.into());
6559
let mut many_boxes = ManyBoxes { boxes: vec![] };
66-
for (label, one_box) in boxes.iter() {
67-
many_boxes.boxes.push(
68-
builder
69-
.add_labeled_asset_with_new_handle(label, SavedAsset::from_asset(one_box)),
70-
);
60+
for (index, one_box) in boxes.iter().enumerate() {
61+
many_boxes
62+
.boxes
63+
.push(builder.add_labeled_asset_with_new_handle(
64+
index.to_string(),
65+
SavedAsset::from_asset(one_box),
66+
));
7167
}
7268

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

0 commit comments

Comments
 (0)