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

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

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

@ -58,7 +58,9 @@ impl<T: ManifestEntry> AssetLoader for ManifestAssetLoader<T> {
for id in raw {
let id = Identifier::<T::Marker>::new(id)?;
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 })
}

@ -5,13 +5,14 @@ use std::path::Path;
use bevy::prelude::*;
use bevy::asset::{UntypedAssetId, VisitAssetDependencies};
use bevy::platform::collections::HashMap;
use derive_where::derive_where;
use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[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")]
pub struct Identifier<T> {
#[deref]
@ -118,7 +119,7 @@ impl<T> TryFrom<&Path> for Identifier<T> {
#[derive(Deserialize, Serialize, Reflect, Deref, DerefMut)]
#[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> {
fn clone(&self) -> Self {

Loading…
Cancel
Save