From 8700c23893c8e521d96d91756b97af8d10db9fdd Mon Sep 17 00:00:00 2001 From: copygirl Date: Mon, 5 Jan 2026 13:08:25 +0100 Subject: [PATCH] Preserve insertion order by using `IndexMap` --- Cargo.lock | 20 +++++++++++--------- Cargo.toml | 1 + common/Cargo.toml | 1 + common/src/assets/manifest.rs | 4 +++- common/src/identifier.rs | 7 ++++--- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8d1ea8..1f2b144 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/Cargo.toml b/Cargo.toml index baddc86..3a84d6c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/common/Cargo.toml b/common/Cargo.toml index 93678d3..fc88329 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -9,6 +9,7 @@ lightyear.workspace = true derive-where.workspace = true +indexmap.workspace = true ron.workspace = true serde.workspace = true thiserror.workspace = true diff --git a/common/src/assets/manifest.rs b/common/src/assets/manifest.rs index 7ba9671..3d0f78f 100644 --- a/common/src/assets/manifest.rs +++ b/common/src/assets/manifest.rs @@ -58,7 +58,9 @@ impl AssetLoader for ManifestAssetLoader { for id in raw { let id = Identifier::::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 }) } diff --git a/common/src/identifier.rs b/common/src/identifier.rs index 20b2a85..2f96014 100644 --- a/common/src/identifier.rs +++ b/common/src/identifier.rs @@ -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 { #[deref] @@ -118,7 +119,7 @@ impl TryFrom<&Path> for Identifier { #[derive(Deserialize, Serialize, Reflect, Deref, DerefMut)] #[derive_where(Default)] -pub struct IdentifierMap(HashMap, V>); +pub struct IdentifierMap(IndexMap, V>); impl Clone for IdentifierMap { fn clone(&self) -> Self {