Preserve insertion order by using `IndexMap`

main
copygirl 3 weeks ago
parent 83f3dcf78e
commit 8700c23893
  1. 20
      Cargo.lock
  2. 1
      Cargo.toml
  3. 1
      common/Cargo.toml
  4. 4
      common/src/assets/manifest.rs
  5. 7
      common/src/identifier.rs

20
Cargo.lock generated

@ -643,6 +643,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"bevy", "bevy",
"derive-where", "derive-where",
"indexmap",
"lightyear", "lightyear",
"ron 0.12.0", "ron 0.12.0",
"serde", "serde",
@ -1412,7 +1413,7 @@ dependencies = [
"foldhash 0.2.0", "foldhash 0.2.0",
"futures-channel", "futures-channel",
"getrandom 0.3.4", "getrandom 0.3.4",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"js-sys", "js-sys",
"portable-atomic", "portable-atomic",
"portable-atomic-util", "portable-atomic-util",
@ -3554,13 +3555,14 @@ dependencies = [
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.16.0" version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"foldhash 0.2.0", "foldhash 0.2.0",
"serde", "serde",
"serde_core",
] ]
[[package]] [[package]]
@ -3772,12 +3774,12 @@ dependencies = [
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.12.0" version = "2.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"serde", "serde",
"serde_core", "serde_core",
] ]
@ -4570,7 +4572,7 @@ dependencies = [
"bevy_platform", "bevy_platform",
"bevy_reflect", "bevy_reflect",
"bevy_utils", "bevy_utils",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"paste", "paste",
"seahash", "seahash",
"tracing", "tracing",
@ -5519,7 +5521,7 @@ dependencies = [
"either", "either",
"ena", "ena",
"foldhash 0.2.0", "foldhash 0.2.0",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"log", "log",
"nalgebra", "nalgebra",
"num-derive", "num-derive",
@ -5545,7 +5547,7 @@ dependencies = [
"either", "either",
"ena", "ena",
"foldhash 0.2.0", "foldhash 0.2.0",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"log", "log",
"nalgebra", "nalgebra",
"num-derive", "num-derive",

@ -16,6 +16,7 @@ bevy = { version = "0.17.2", features = [ "serialize" ] }
derive-where = { version = "1.6.0", features = [ "serde" ] } derive-where = { version = "1.6.0", features = [ "serde" ] }
indexmap = "2.12.1"
ron = "0.12.0" ron = "0.12.0"
serde = "1.0.228" serde = "1.0.228"
thiserror = "2.0.17" thiserror = "2.0.17"

@ -9,6 +9,7 @@ lightyear.workspace = true
derive-where.workspace = true derive-where.workspace = true
indexmap.workspace = true
ron.workspace = true ron.workspace = true
serde.workspace = true serde.workspace = true
thiserror.workspace = true thiserror.workspace = true

@ -58,7 +58,9 @@ impl<T: ManifestEntry> AssetLoader for ManifestAssetLoader<T> {
for id in raw { for id in raw {
let id = Identifier::<T::Marker>::new(id)?; let id = Identifier::<T::Marker>::new(id)?;
let handle = load_context.load(format!("blocks/{id}.ron")); let handle = load_context.load(format!("blocks/{id}.ron"));
map.try_insert(id, handle).map_err(|_| "duplicate entry")?; if map.insert(id, handle).is_some() {
return Err("duplicate entry".into());
}
} }
Ok(ManifestAsset { map }) Ok(ManifestAsset { map })
} }

@ -5,13 +5,14 @@ use std::path::Path;
use bevy::prelude::*; use bevy::prelude::*;
use bevy::asset::{UntypedAssetId, VisitAssetDependencies}; use bevy::asset::{UntypedAssetId, VisitAssetDependencies};
use bevy::platform::collections::HashMap;
use derive_where::derive_where; use derive_where::derive_where;
use indexmap::IndexMap;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use thiserror::Error; use thiserror::Error;
#[derive(Reflect, Deref)] #[derive(Reflect, Deref)]
#[derive_where(Deserialize, Serialize, Clone, PartialEq, Eq, Hash, Debug)] #[derive_where(Deserialize, Serialize)]
#[derive_where(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
#[serde(try_from = "String", into = "String")] #[serde(try_from = "String", into = "String")]
pub struct Identifier<T> { pub struct Identifier<T> {
#[deref] #[deref]
@ -118,7 +119,7 @@ impl<T> TryFrom<&Path> for Identifier<T> {
#[derive(Deserialize, Serialize, Reflect, Deref, DerefMut)] #[derive(Deserialize, Serialize, Reflect, Deref, DerefMut)]
#[derive_where(Default)] #[derive_where(Default)]
pub struct IdentifierMap<T, V>(HashMap<Identifier<T>, V>); pub struct IdentifierMap<T, V>(IndexMap<Identifier<T>, V>);
impl<T, V: Clone> Clone for IdentifierMap<T, V> { impl<T, V: Clone> Clone for IdentifierMap<T, V> {
fn clone(&self) -> Self { fn clone(&self) -> Self {

Loading…
Cancel
Save